我试图通过点击按钮重新绘制面板,但它没有发生。我尝试使用很多方法,如setEnabled(true),setVisible(true),repaint(),但这些方法都不起作用。而且我想在两个面板之间切换,如果我单击“Total Vote”按钮,应显示一个面板,当我点击“Departmentwise Vote”时,另一个面板应显示在同一个地方。
请帮忙。提前谢谢。
这里我提供代码:
public class RSummary extends JFrame implements ActionListener
{
JFrame rframe = new JFrame();
JPanel panel1, panel2, panel3, panel4, panel5;
JTable table;
JScrollPane scroll;
JSplitPane splitPane;
JButton butx;
public RSummary()
{
rframe.setSize(550,300);
rframe.setLocationRelativeTo(null);
setSize(550,300);
rframe.setTitle("Summary Report");
/* Total Vote & Department wise vote buttons */
panel1= new JPanel();
JButton but1 = new JButton("TOTAL VOTE");
JButton but2 = new JButton("DEPTARTMENT WISE VOTE");
but1.addActionListener(this);
panel1.add(but1);
panel1.add(but2);
/* Report contents according to button */
panel2 = new JPanel();
String[] columnNames = {"Name", "Department","Phno","LUID","Select"};
DefaultTableModel model1 = new DefaultTableModel();
model1.setColumnIdentifiers(columnNames);
table = new JTable();
table.setModel(model1);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
table.setFillsViewportHeight(true);
scroll = new JScrollPane(table);
panel2.add(scroll);
panel2.setVisible(false);
/* close button */
panel3 = new JPanel();
JButton but4= new JButton("CLOSE");
but4.addActionListener(this);
panel3.add(but4);
/* Page heading */
panel4 = new JPanel();
JLabel lab =new JLabel("VOTE SUMMARY REPORT");
panel4.add(lab);
/* dummy panel */
panel5 = new JPanel();
JButton butx = new JButton("Hello butx");
panel5.add(butx);
splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, panel1, panel2);
rframe.add(splitPane);
rframe.add(panel3,BorderLayout.SOUTH);
rframe.add(panel4,BorderLayout.NORTH);
rframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
rframe.setVisible(true);
}
public void actionPerformed(ActionEvent ae)
{
String action=ae.getActionCommand();
if(action == "CLOSE")
{
rframe.setVisible(false);
}
if(action == "TOTAL VOTE")
{
panel2.setVisible(true); //this code is not working, i want the solution here.
}
}
public static void main(String args[]) throws ClassNotFoundException, SQLException
{
new RSummary();
}
}
答案 0 :(得分:3)
第一个问题是您要比较String
值的对象引用而不是内容......
if(action == "TOTAL VOTE")
由于String
由Java管理的方式,它们不太可能是平等的。
String
比较是使用String#equals
完成的
if ("TOTAL VOTE".equals(action))
您的第二个问题可能与setVisible
可能无法使容器层次结构无效这一事实有关,这会告诉布局框架容器需要更新。
你有两个解决方案,第一个是在父容器上调用revalidate
,第二个,更好的是,使用CardLayout
,这是为了你正在尝试的做...
请查看How to use Card Layout了解详情
运行代码后更新
你有一系列复合问题......
actionPerformed
事件时,action
实际上是null
RSummary
从JFrame
延伸,但您创建了第二个名为JFrame
的{{1}}。这非常令人困惑,如果您没有处理正确的框架,可能会导致更多问题。首先设置按钮的rframe
属性...
actionCommand
然后从JButton but1 = new JButton("TOTAL VOTE");
but1.setActionCommand("TOTAL VOTE");
移除extends JFrame
,因为除了增加混乱并且没有任何好处之外什么都不做
将框架设置为不可见不会“关闭”它。而是使用RSummary
最后,在拆分窗格的一部分时使组件可见不会调整拆分分隔符的大小。完成更正后,您需要手动移动分隔线。
您可以考虑将空面板放入拆分窗格并使用JFrame#dispose
,将其他组件添加到其中,使用CardLayout
已更新修改后的代码
CardLayout
答案 1 :(得分:2)
要切换面板,您可以执行以下操作:
rframe.remove (panelToRemove);
rframe.add(panelToShow);
这是您的问题的答案,或者您为什么要重新绘制?
Geosearchef
<强>更新强>
总结一下:
MadProgrammer是对的,您必须将if(action == "TOTAL VOTE")
替换为if(action.equals("TOTAL VOTE"))
(对于CLOSE也是如此)
你必须添加一个actionCommand:
JButton but1 = new JButton("TOTAL VOTE");
but1.addActionListener(this);
but1.setActionCommand("TOTAL VOTE");
更改面板:
if (action.equals("TOTAL VOTE")) {
try{rframe.remove(panel1;)}catch(Exception e){}//clear window, maybe there is a method
try{rframe.remove(panel2;)}catch(Exception e){}
try{rframe.remove(panel3;)}catch(Exception e){}
rframe.add(panel2);//the panel you want to show
}
当然,您必须将面板的引用引用到actionPerformed(ActionEvent ae)
。