【发布时间】:2018-06-26 23:44:23
【问题描述】:
我正在尝试将我的代码分成更小的类。我目前正在使用 CardLayout。第一类显示变量很好,但第二类没有显示任何东西。当我转到第二张卡时,我得到一个空白页。我确定原因是因为它们没有分成类。我是否需要在不同的类中设置 CardLayout 并让这两个共享?
头等舱
public test1()
{
mainCL.setLayout(c1);
main1.setPreferredSize(new Dimension(800, 900));
mainCL.add(main1,"1");
main1.setBackground(Color.BLUE);
main1.setLayout(null);
main2.setLayout(null);
btnNewButton.setBounds(254, 835, 117, 29);
main1.add(btnNewButton);
JComboBox comboBox = new JComboBox();
comboBox.setBounds(189, 130, 244, 27);
main1.add(comboBox);
mainCL.add(main1,"1");
mainCL.add(main2,"2");
c1.show(mainCL, "1");
frame.setBounds(100, 100, 450, 300);
frame.getContentPane().add(mainCL);
frame.setVisible(true);
frame.pack();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent arg0) {
c1.show(mainCL,"2");
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new ttt();
}
});
}
二等
public class test2 extends test1{
private final JButton btnNewButton1 = new JButton("drop");
test2(){
JComboBox comboBox1 = new JComboBox();
comboBox1.setBounds(189, 200, 244, 27);
btnNewButton1.setBounds(254, 835, 117, 29);
main2.add(comboBox1);
main2.add(btnNewButton1);
}
编辑
抱歉之前的代码。我只是对此进行测试,所以我没有考虑命名约定。做了一些研究,我想我可能已经解决了我的问题。下面是我更新的代码。如果我有问题,请告诉我。谢谢!
头等舱
public test1()
{
private JLabel label;
JFrame frame;
JPanel panelCont;
JPanel panelOne;
JButton btnOne;
JComboBox signD = new JComboBox();
CardLayout cards;
test2 panelTwo;
public test1() {
frame = new JFrame("CardLayout in two classes test");
panelCont = new JPanel();
panelOne = new JPanel();
panelOne.setPreferredSize(new Dimension(600, 600));
cards = new CardLayout();
panelTwo = new test2(cards, panelCont);
label = new JLabel("Page 1");
btnOne = new JButton("Switch");
panelCont.setLayout(cards);
panelOne.setBackground(Color.BLUE);
panelCont.add(panelOne, "1");
//GridBag
GridBagConstraints gbc_label = new GridBagConstraints();
GridBagLayout gbl_panelOne = new GridBagLayout();
GridBagConstraints gbc_signD = new GridBagConstraints();
GridBagConstraints gbc_buttonOne = new GridBagConstraints();
//Panel
gbl_panelOne.columnWidths = new int[]{100,400,100};
gbl_panelOne.rowHeights = new int[]{100,400,100};
panelOne.setLayout(gbl_panelOne);
//Label
label.setFont(new Font("Avenir", Font.PLAIN, 35));
gbc_label.gridx = 1;
gbc_label.gridy = 0;
panelOne.add(label, gbc_label);
//Dropdown
signD.setPreferredSize(new Dimension(200, 27));
signD.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
signD.setModel(new DefaultComboBoxModel(new String[] {"Dropdown1", "Dropdown2"}));
signD.setForeground(Color.DARK_GRAY);
gbc_signD.gridx = 1;
gbc_signD.gridy = 1;
panelOne.add(signD, gbc_signD);
//Btn
btnOne.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
btnOne.setHorizontalTextPosition(SwingConstants.CENTER);
gbc_buttonOne.gridy = 2;
gbc_buttonOne.insets = new Insets(0, 0, 20, 5);
gbc_buttonOne.anchor = GridBagConstraints.SOUTH;
gbc_buttonOne.gridx = 1;
panelOne.add(btnOne, gbc_buttonOne);
//ActionListener
btnOne.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cards.show(panelCont, "2");
}
});
panelCont.add(panelTwo, "2");
cards.show(panelCont, "1");
//Frame
frame.getContentPane().add(panelCont);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
二等
public class test2 extends JPanel{
JButton btnTwo;
CardLayout layout;
JPanel panelCont;
JLabel label = new JLabel("Page 2");
JComboBox signD2 = new JComboBox();
public test2(final CardLayout layout, JPanel panelCont) {
this.layout = layout;
this.panelCont = panelCont;
GridBagLayout gridBagLayout2 = new GridBagLayout();
gridBagLayout2.columnWidths = new int[]{100,400,100};
gridBagLayout2.rowHeights = new int[]{100,400,100};
setLayout(gridBagLayout2);
setBackground(Color.RED);
btnTwo = new JButton("Back");
//GridBag
GridBagConstraints gbc_label = new GridBagConstraints();
GridBagConstraints gbc_signD = new GridBagConstraints();
GridBagConstraints gbc_buttonTwo = new GridBagConstraints();
//Label
label.setFont(new Font("Avenir", Font.PLAIN, 35));
gbc_label.gridx = 1;
gbc_label.gridy = 0;
add(label, gbc_label);
//Dropdown
signD2.setPreferredSize(new Dimension(200, 27));
signD2.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
signD2.setModel(new DefaultComboBoxModel(new String[] {"Dropdown3", "Dropdown4"}));
signD2.setForeground(Color.DARK_GRAY);
gbc_signD.gridx = 1;
gbc_signD.gridy = 1;
add(signD2, gbc_signD);
//btn
btnTwo.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
btnTwo.setHorizontalTextPosition(SwingConstants.CENTER);
gbc_buttonTwo.gridy = 2;
gbc_buttonTwo.insets = new Insets(0, 0, 20, 5);
gbc_buttonTwo.anchor = GridBagConstraints.SOUTH;
gbc_buttonTwo.gridx = 1;
add(btnTwo, gbc_buttonTwo);
btnTwo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
layout.show(panelCont, "1");
}
});
}
}
主要
public class main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new test1();
}
});
}}
【问题讨论】:
-
首先,您误用了继承,因为 test2 不应扩展 test1。而是使用组合来帮助解决您的问题。这不是您重构代码以使其更小、更易于管理的方式,事实上您的更改只会增加复杂性,使增强和调试变得更加困难。
-
下一个关于
null布局的词——你不想使用这些 -
如果这是我的代码,并且我想重构,我会考虑为 JPanel “卡片”创建单独的类,这些卡片将被添加到使用 CardLayout 的容器中。我还考虑创建一个模型/控制器类来帮助协调卡片的变化。
-
最后,您的 main 方法声明并初始化您上面发布的 none 类,而是创建一个新的
ttt对象,不管这到底是什么。确实很混乱。 -
@Hovercraft 很抱歉。感谢您的建议。在编辑中,我更改了继承。第二类现在扩展了 JPanel。我还将布局从 null 更改为 Gridbag。再次感谢您的评论。我还用第一堂课初始化了 main 。我没有创建控制器/类,而是将 actionlistener 按钮指向下一个类,它似乎可以工作。
标签: java swing class layout-manager cardlayout