Java 摆动组件之间的通信
Java swing communication between components
我在连接 Swing 中的组件时遇到问题,这些组件会以交互或执行动作流的方式连接。我的计划是在按下按钮时 disable/enable 一个 JTextPane,然后输入数字,以便程序可以开始计算。到目前为止,这是我停留的地方:
private JPanel contentPane;
protected JTextPane txtpnA;
protected JTextPane txtpnB;
protected JTextPane txtpnC;
/* Button 'a' **/
JButton btnA = new JButton("a");
btnA.setBackground(Color.YELLOW);
btnA.setBounds(47, 54, 89, 23);
btnA.setActionCommand("a");
btnA.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
} {
}
});
contentPane.add(btnA);
/* TextPane 'a' **/
txtpnA = new JTextPane();
txtpnA.setBounds(47, 88, 89, 20);
contentPane.add(txtpnA);
txtpnA.setBorder(BorderFactory.createLineBorder(Color.black));
方法如下:
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
if(command.equals("a"))
{
txtpnA.setEnabled(false);
} else if(command.equals("b"))
{
txtpnB.setEnabled(false);
} else if(command.equals("c"))
{
txtpnC.setEnabled(false);
}
}
}
我很难找到有关 JComponent 之间通信的文章。如果您还可以建议详细的来源,我们将不胜感激。
如果我理解你的问题,你想制作一个通用的 ActionListener,它将被你的按钮调用。
您可以在有这些按钮的 class 中创建内部私有 class。并将该内部 class 的一个实例添加到按钮的 ActionListener。
public class MyClass {
//...//
JButton a = new JButton("a");
a.setActionCommand("a");
a.setBounds(0, 0, 50, 50);
a.addActionListener(new ActionButtons());
//...//
private class ActionButtons implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
String action = arg0.getActionCommand();
if(action.equals("a")) {
System.out.println("a");
}
if(action.equals("b")) {
System.out.println("b");
}
if(action.equals("c")) {
System.out.println("c");
}
}
}
}
P.S.: 如果你想在多个class中使用那个ActionListener,你可以在其他class中声明为public class ] 文件。
我建议您创建一个新的 class 来处理您对特定组件的请求并且不要使用匿名事件处理程序:
public class ButtonHandler extends AbstractAction {
private JComponent componentToDisable;
public ButtonHandler(JComponent comp, String text) {
super(text);
componentToDisable = comp;
}
public void actionPerformed(ActionEvent event) {
componentToDisable.setEnabled(false);
}
}
使用方法:
/* TextPane 'a' **/
txtpnA = new JTextPane();
txtpnA.setBounds(47, 88, 89, 20);
contentPane.add(txtpnA);
txtpnA.setBorder(BorderFactory.createLineBorder(Color.black));
JButton btnA = new JButton(new ButtonHandler(textpnA, "a"));
btnA.setBackground(Color.YELLOW);
btnA.setBounds(47, 54, 89, 23);
contentPane.add(btnA);
其他按钮的步骤相同。
JButton btnB = new JButton(new ButtonHandler(textpnB, "b"));
JButton btnC = new JButton(new ButtonHandler(textpnC, "c"));
最后但并非最不重要的一点。正如安德鲁汤普森已经提到的那样:
Java GUIs have to work on different OS', screen size, screen resolution etc. using different PLAFs in different locales. As such, they are not conducive to pixel perfect layout. Instead use layout managers, or combinations of them along with layout padding and borders for white space.
我在连接 Swing 中的组件时遇到问题,这些组件会以交互或执行动作流的方式连接。我的计划是在按下按钮时 disable/enable 一个 JTextPane,然后输入数字,以便程序可以开始计算。到目前为止,这是我停留的地方:
private JPanel contentPane;
protected JTextPane txtpnA;
protected JTextPane txtpnB;
protected JTextPane txtpnC;
/* Button 'a' **/
JButton btnA = new JButton("a");
btnA.setBackground(Color.YELLOW);
btnA.setBounds(47, 54, 89, 23);
btnA.setActionCommand("a");
btnA.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
} {
}
});
contentPane.add(btnA);
/* TextPane 'a' **/
txtpnA = new JTextPane();
txtpnA.setBounds(47, 88, 89, 20);
contentPane.add(txtpnA);
txtpnA.setBorder(BorderFactory.createLineBorder(Color.black));
方法如下:
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
if(command.equals("a"))
{
txtpnA.setEnabled(false);
} else if(command.equals("b"))
{
txtpnB.setEnabled(false);
} else if(command.equals("c"))
{
txtpnC.setEnabled(false);
}
}
}
我很难找到有关 JComponent 之间通信的文章。如果您还可以建议详细的来源,我们将不胜感激。
如果我理解你的问题,你想制作一个通用的 ActionListener,它将被你的按钮调用。
您可以在有这些按钮的 class 中创建内部私有 class。并将该内部 class 的一个实例添加到按钮的 ActionListener。
public class MyClass {
//...//
JButton a = new JButton("a");
a.setActionCommand("a");
a.setBounds(0, 0, 50, 50);
a.addActionListener(new ActionButtons());
//...//
private class ActionButtons implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
String action = arg0.getActionCommand();
if(action.equals("a")) {
System.out.println("a");
}
if(action.equals("b")) {
System.out.println("b");
}
if(action.equals("c")) {
System.out.println("c");
}
}
}
}
P.S.: 如果你想在多个class中使用那个ActionListener,你可以在其他class中声明为public class ] 文件。
我建议您创建一个新的 class 来处理您对特定组件的请求并且不要使用匿名事件处理程序:
public class ButtonHandler extends AbstractAction {
private JComponent componentToDisable;
public ButtonHandler(JComponent comp, String text) {
super(text);
componentToDisable = comp;
}
public void actionPerformed(ActionEvent event) {
componentToDisable.setEnabled(false);
}
}
使用方法:
/* TextPane 'a' **/
txtpnA = new JTextPane();
txtpnA.setBounds(47, 88, 89, 20);
contentPane.add(txtpnA);
txtpnA.setBorder(BorderFactory.createLineBorder(Color.black));
JButton btnA = new JButton(new ButtonHandler(textpnA, "a"));
btnA.setBackground(Color.YELLOW);
btnA.setBounds(47, 54, 89, 23);
contentPane.add(btnA);
其他按钮的步骤相同。
JButton btnB = new JButton(new ButtonHandler(textpnB, "b"));
JButton btnC = new JButton(new ButtonHandler(textpnC, "c"));
最后但并非最不重要的一点。正如安德鲁汤普森已经提到的那样:
Java GUIs have to work on different OS', screen size, screen resolution etc. using different PLAFs in different locales. As such, they are not conducive to pixel perfect layout. Instead use layout managers, or combinations of them along with layout padding and borders for white space.