首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态FlowLayout

动态FlowLayout
EN

Stack Overflow用户
提问于 2014-11-01 09:16:06
回答 2查看 518关注 0票数 1

我正在尝试制作一个程序,该程序接受用户的输入,当用户按enter时,在我的FlowLayout面板中安排按钮的属性。但很明显我的代码不起作用。但是没有错误。

代码语言:javascript
复制
package hm2v;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
import javax.swing.border.*;

public class LayoutM extends JFrame {

static String[] alc = {"LEFT", "RIGHT"};

static JLabel align = new JLabel("Aligment ");
static JLabel hgap = new JLabel("HGap ");
static JLabel vgap = new JLabel("VGap ");

final static JComboBox aligncom = new JComboBox(alc);
final static JTextField hgaptext = new JTextField(10);
final static JTextField vgaptext = new JTextField(10);

final static FlowLayout exL = new FlowLayout(FlowLayout.LEFT, 3, 4);

public static void main(String[] args) {

    new LayoutM();

    LayoutM frame = new LayoutM();
    frame.setTitle("Dynamic FlowLayout");
    frame.setSize(400, 325);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}

public LayoutM() {

    Container contain = getContentPane();
    contain.setLayout(new BorderLayout());

    final FlowLayout exL = new FlowLayout(FlowLayout.LEFT, 3, 4);

    final JPanel panel1 = new JPanel();
    panel1.setLayout(exL);
    panel1.setBorder(new TitledBorder("A Container of FlowLayout"));
    for (int i = 0; i < 15; i++) {
        panel1.add(new JButton("Component " + i));
    }

    JPanel panel2 = new JPanel();
    panel2.setLayout(new BorderLayout());
    panel2.setBorder(new TitledBorder("FlowLayout Properties"));

    JPanel p3 = new JPanel();
    p3.setLayout(new GridLayout(3, 1, 0, 5));

    JPanel p4 = new JPanel();
    p4.setLayout(new GridLayout(3, 1, 0, 5));

    p3.add(align);
    p3.add(hgap);
    p3.add(vgap);

    p4.add(aligncom);
    p4.add(hgaptext);
    p4.add(vgaptext);

    panel2.add(p3, BorderLayout.WEST);
    panel2.add(p4);

    contain.add(panel1);
    contain.add(panel2, BorderLayout.SOUTH);

    addKeyListener(new KeyListener() {
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                System.out.println("Enter pressed");

                aligncom.addItemListener(new ItemListener() {
                    @Override
                    public void itemStateChanged(ItemEvent e) {
                        int x = aligncom.getSelectedIndex();
                        switch (x) {
                            case 0: {
                                exL.setAlignment(FlowLayout.LEFT);
                            }
                            case 1: {
                                exL.setAlignment(FlowLayout.RIGHT);
                                break;
                            }
                        }

                    }

                });

                hgaptext.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String y = hgaptext.getText();
                        int z = Integer.parseInt(y);

                        exL.setHgap(z);

                    }
                });

                vgaptext.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String v = vgaptext.getText();
                        int g = Integer.parseInt(v);

                        exL.setHgap(g);

                    }
                });

            }
        }

        @Override
        public void keyTyped(KeyEvent e) {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }

        @Override
        public void keyReleased(KeyEvent e) {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }

    });

}
}

当我输入输入并按enter时,没有什么变化,它不会写"Enter按下“。我在哪里搞错了?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-01 10:06:13

第一个问题

您正在尝试向框架中添加一个KeyListener。我不明白你为什么需要这个。正如我所理解的,当用户在输入后按回车时,应该会发生一些事情。

您可以通过向文本字段添加一个ActionListener来实现这一点。只要该领域仍有重点,这将发挥作用。这就是你想要的结果(让这个领域有焦点)。所以摆脱KeyListener

第二个问题

即使KeyListener确实工作了,您也不会做任何事情,只会向组件添加一个新的侦听器。因此,每次按下键,所发生的一切都是将另一个侦听器添加到组件中.没别的事了。

第三个问题

在进行任何布局更改后,您需要对revalidaterepaint进行panel1

代码语言:javascript
复制
 panel1.revalidate();
 panel1.repaint();

总结

  1. 完全摆脱KeyListener (删除它,并将所有其他内容保持不变-将代码留在按键方法中)
  2. panel1ActionListeners中重新验证和重新绘制ItemListener

这就是你要让它开始工作所需要的一切

哦,你在0的案子里少了一个0

代码语言:javascript
复制
case 0: {
   exL.setAlignment(FlowLayout.LEFT);
   break;
}

更新

用户选择“左”或“右”,键入HGap和VGap,只有在用户按enter之后,它们才会更改。

基本上,您必须取出我们正在处理的所有侦听器,并向内容窗格中添加一个键绑定。You can see this post and use the same code。只需将“左”改为“输入”即可。和doSomethingWhenLeftIsPressed()方法--您应该从组合框和字段中获取值,并设置布局,全部放在一个

我会在这里贴代码

代码语言:javascript
复制
JPanel panel = (JPanel)frame.getContentPane();
InputMap imap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
imap.put(KeyStroke.getKeyStroke("ENTER"), "layoutAction");
ActionMap amap = panel.getActionMap();
Action leftAction = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        doSomethingWhenEnterIsPressed();
    }
};
amap.put("layoutAction", leftAction);

...
private void doSomethingWhenEnterIsPressed() {
    // get values from field and combo and set the layout like before
}
票数 3
EN

Stack Overflow用户

发布于 2014-11-01 09:17:53

在新的排序之后尝试函数revalidate

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26687780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档