因此,为了好玩,我一直在开发这个简单的图表GUI,它从YahooFinance抓取图表并将它们显示在选项卡式的Jpanel中。我已经能够使用用户定义的库存以及所有填充选项卡。但是,我开发了一些按钮,这些按钮可以查询图表的不同方面(指标带,移动平均线等),并希望能够使用此更新图表“重绘”面板。
问题:我不确定如何访问通过以下方法创建的各个面板。我需要能够选择一个面板(例如,当i = 1以下时创建的panel1),并在ActionListener中对其进行更新。我真的只是想知道Java如何在循环中定义这些面板,以便以后可以访问它们并重新绘制标签!干杯。
public static void urlstock(String options,final String[] s, final JFrame f,final
JTabbedPane tpane) throws IOException{
for(int i=0;i<s.length;i++){
String path = "http://chart.finance.yahoo.com/z?s="+s[i]+options;
URL url = new URL(path);
BufferedImage image = ImageIO.read(url);
JLabel label = new JLabel(new ImageIcon(image));
JPanel panel=new JPanel();
tpane.addTab(s[i],null, panel);
panel.add(label);
}
因此,我尝试了按按钮提示的操作,但由于无法理解
panel
的原因,因此无法正常工作: public void actionPerformed(ActionEvent e)
{ //Execute when button is pressed
System.out.println("MAButton");
tpane.getComponentAt(1);
tpane.remove(panel);
//Container.remove();
String path = "http://chart.finance.yahoo.com/z?s=GOOG&t=7m&z=l&q=l&a=ss,sfs";
URL url = new URL(path);
BufferedImage image = ImageIO.read(url);
JLabel label = new JLabel(new ImageIcon(image));
JPanel panel=new JPanel();
tpane.setComponentAt(1,panel);
panel.add(label);
}
最佳答案
使用名称(s[i]
)JTabbedPane#indexOfTab(String)
来获取相关标签的索引
在检索的索引(JTabbedPane#getComponentAt(int)
)处获取对该组件的引用
删除检索到的组件Container#removeAll()
的内容
添加新标签。
用示例更新
public class TestTabPane {
public static void main(String[] args) {
new TestTabPane();
}
public TestTabPane() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final JTabbedPane tabPane = new JTabbedPane();
JPanel panel = new JPanel();
JButton updateButton = new JButton("Update me");
panel.add(updateButton);
updateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int indexOfTab = tabPane.indexOfTab("Testing");
JPanel panel = (JPanel) tabPane.getComponentAt(indexOfTab);
panel.removeAll();
panel.add(new JLabel("I've begin updated"));
panel.repaint();
}
});
tabPane.addTab("Testing", panel);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(tabPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
关于java - 在循环定义的jpanel中重绘jlabel并在循环中声明jpanels,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13465608/