我正在尝试制作一个程序,该程序接受用户的输入,当用户按enter时,在我的FlowLayout面板中安排按钮的属性。但很明显我的代码不起作用。但是没有错误。
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按下“。我在哪里搞错了?谢谢!
发布于 2014-11-01 10:06:13
第一个问题
您正在尝试向框架中添加一个KeyListener。我不明白你为什么需要这个。正如我所理解的,当用户在输入后按回车时,应该会发生一些事情。
您可以通过向文本字段添加一个ActionListener来实现这一点。只要该领域仍有重点,这将发挥作用。这就是你想要的结果(让这个领域有焦点)。所以摆脱KeyListener
第二个问题
即使KeyListener确实工作了,您也不会做任何事情,只会向组件添加一个新的侦听器。因此,每次按下键,所发生的一切都是将另一个侦听器添加到组件中.没别的事了。
第三个问题
在进行任何布局更改后,您需要对revalidate和repaint进行panel1。
panel1.revalidate();
panel1.repaint();总结
KeyListener (删除它,并将所有其他内容保持不变-将代码留在按键方法中)panel1和ActionListeners中重新验证和重新绘制ItemListener。这就是你要让它开始工作所需要的一切
哦,你在0的案子里少了一个0
case 0: {
exL.setAlignment(FlowLayout.LEFT);
break;
}更新
用户选择“左”或“右”,键入HGap和VGap,只有在用户按enter之后,它们才会更改。
基本上,您必须取出我们正在处理的所有侦听器,并向内容窗格中添加一个键绑定。You can see this post and use the same code。只需将“左”改为“输入”即可。和doSomethingWhenLeftIsPressed()方法--您应该从组合框和字段中获取值,并设置布局,全部放在一个
我会在这里贴代码
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
}发布于 2014-11-01 09:17:53
在新的排序之后尝试函数revalidate。
https://stackoverflow.com/questions/26687780
复制相似问题