我正在尝试按照标题所说的去做。
我有一种有效的方法可以将几个相同的 Swing 对象发布到一个框架中,方法是将它们存储在一个数组中并使用 for 循环添加它们,如下所示:
JLabel[] contrllabels= new JLabel[8];
contrllabels[0] = new JLabel("SCF Type: ");
contrllabels[1] = new JLabel("Units: ");
contrllabels[2] = new JLabel("Spherical Harmonics: ");
contrllabels[3] = new JLabel("Molecular Charge: ");
contrllabels[4] = new JLabel("PP: ");
contrllabels[5] = new JLabel("DFT Type: ");
contrllabels[6] = new JLabel("Max Iterations: ");
contrllabels[7] = new JLabel("Mult: ");
for(int i = 0;i<contrllabels.length;i++){
c.gridy = i;
frame.add(contrllabels[i],c);
}
但是如果有多个不同类型的 Swing 对象呢?我有几个组合框和文本字段,我想以类似的方式将它们添加到框架中。我使用 gridbaglayout,所以如果我不使用 for 循环,我最终会得到很多不必要的代码,因为每次我想添加不同的对象时都会给约束新值。
是否有指向这些不同对象的引用数组,然后我可以遍历这些对象以将其添加到框架中?有点像
JTextField tf = new JTextField(5);
JComboBox cb = new JComboBox("example");
Swing[] array = {tf,cb}
for(int i = 0;i<array.length;i++){
c.gridy = i;
frame.add(array[i],c);
}
我知道这样的数组不存在,但是有什么方法可以实现这样的东西吗?这将大大减少我的代码中的行数并减少混淆。
谢谢
最佳答案
您可以使用通用父类(super class)型的数组或集合,例如 JComponent 的数组或 ArrayList。我很好奇您是否正在使用 GridBagConstraints 的并行数组来处理要添加的每个组件——呃。我经常使用组件数组,但通常情况下它们类似于组件,例如 JLabel/JTextField 对或一组 JRadioButton。
顺便说一句,为了我的钱,我尽量避免使用 GridBagLayout,而是嵌套使用对编码人员更友好的布局的容器。
例如,这个小型 GUI 是结合 FlowLayout、BoxLayout、BorderLayout 和 GridLayout 制作的:
容纳整个GUI的大JPanel使用BorderLayout,中间的JTextArea放在BorderLayout.CENTER,最上面的Provider JLabel和JTextField在一个FlowLayout JPanel里,放在整体BorderLayout.NORTH,最下面的按钮是在一个使用 GridLayout(1, 0, 5, 0) 的 JPanel 中,它保存在另一个使用 FlowLayout 的 JPanel 中,该 FlowLayout 位于 GUI BorderLayout.SOUTH 中,右边的内容在使用 JPanel 的 BoxLayout 中。
例如:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
@SuppressWarnings("serial")
public class GetLetterTextGui extends JPanel {
private static final int TA_ROWS = 20;
private static final int TA_COLS = 35;
private static final int PROVIDER_FIELD_COLS = 10;
private static final String GUI_TITLE = "Get Letter Text";
private JList letterList;
private JTextArea textarea = new JTextArea(TA_ROWS, TA_COLS);
private JTextField providerField = new JTextField(PROVIDER_FIELD_COLS);
private JCheckBox addValedictionChkBox = new JCheckBox("Add Valediction", true);
public GetLetterTextGui() {
letterList = new JList(new String[]{"Fe", "Fi", "Fo", "Fum"});
providerField.setText("John Smith, MD");
textarea.setWrapStyleWord(true);
textarea.setLineWrap(true);
JPanel northPanel = new JPanel();
northPanel.add(new JLabel("Provider:"));
northPanel.add(providerField);
JPanel southPanel = new JPanel();
JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0));
btnPanel.add(new JButton("Copy to Clipboard"));
btnPanel.add(new JButton("Clear"));
btnPanel.add(new JButton(new ExitAction()));
southPanel.add(btnPanel);
JPanel eastPanel = new JPanel();
eastPanel.setLayout(new BoxLayout(eastPanel, BoxLayout.PAGE_AXIS));
eastPanel.add(new JScrollPane(letterList));
eastPanel.add(new JPanel() {{add(addValedictionChkBox);}});
int eb = 0;
setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb));
setLayout(new BorderLayout(eb, eb));
add(northPanel, BorderLayout.PAGE_START);
add(eastPanel, BorderLayout.LINE_END);
add(new JScrollPane(textarea), BorderLayout.CENTER);
add(southPanel, BorderLayout.PAGE_END);
}
private class ExitAction extends AbstractAction {
private final Object MNEMONIC = new Integer(KeyEvent.VK_X);
public ExitAction() {
super("Exit");
putValue(MNEMONIC_KEY, MNEMONIC);
}
@Override
public void actionPerformed(ActionEvent evt) {
Window win = SwingUtilities.getWindowAncestor(GetLetterTextGui.this);
win.dispose();
}
}
private static void createAndShowGui() {
GetLetterTextGui mainPanel = new GetLetterTextGui();
JFrame frame = new JFrame(GUI_TITLE);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
}
}
关于java - 将许多不同的 Swing 对象添加到面板/框架的有效方法。 ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8853152/