我有以下揮杆應用程序。問題是我想單擊按鈕操作將新組件添加到Container c。無論何時在構造函數中單獨調用AddGraph()
方法,都會添加圖表。但是,如果我在actionPerformed()
內部調用它,則不添加圖表。 我試過讓AddGraph()
返回圖表對象,然後在actionPerformed()
中添加它,但仍然無法工作。它應該是非常基本的東西,但我找不到正確的方法來做到這一點。從構造公共的container
即c
Java swing按鈕不會添加新的容器組件
public class MainFrame extends JFrame {
ChartPanel chartPanel;
public MainFrame(String title)
{
super(title);
// Set layout manager
setLayout(new BorderLayout());
// Create Swing components
JButton button = new JButton("Click me");
// Add swing components to content pane
final Container c = getContentPane();
c.add(button, BorderLayout.SOUTH);
AddGraph(c);
// button behaviour here
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
//AddGraph(c);
}
});
}
public void AddGraph(Container c)
{
.
.
.
chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
c.add(chartPanel, BorderLayout.CENTER);
}
}
不應該將組件添加到容器嗎?我沒有看到你在任何地方做這件事。你的'AddGraph'方法應該將容器作爲參數,但是我看到你創建了一個與'MainFrame'構造函數不一樣的新容器。 – Omoro
我已經改變了這一點,加入c作爲參數AddGraph仍然是相同的結果 - 工作時調用的按鈕事件,而不是在裏面調用時工作... – Konstantin
@ user3259222:你試過調用'frame.validate()和frame在'actionPerformed'方法內添加'charPanel'後的.repaint()'? 'JFrame'默認佈局是'BorderLayout'不需要明確設置。如果將組件添加到「JPanel」,然後將此JPanel設置爲「JFrame」的內容窗格,而不是直接將組件添加到頂層容器,這將允許再次使用相同的代碼,另一種觀點。 –