添加新选项卡时更新jtabbedpane

abithluo  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(414)

我在做一个项目,遇到了一个小的逻辑错误,希望你们中的一个能澄清这个问题。
我正在构建一个应用程序,它将显示一个sql数据库(以及其他内容)。目前,按照我的设置方式,我在容器(borderlayout.center)中有一个jtabbedpane,这并不是真正相关的信息。
不管是谁,我想在用户连接到数据库(并最终选择要查看的“表”)后添加一个选项卡。不过,目前只显示一个表。
因此,当用户点击“connect”时,理想情况下连接将成功,此时jtable将填充数据库信息。
一旦该表被初始化并准备就绪,就将其添加到新的jpanel中,并将该面板添加到jtabbedpane中。
这就是错误所在。我“相信”到目前为止我的逻辑是正确的,我没有得到任何编译器/运行时错误,新的选项卡只是没有显示(如果我点击它应该在哪里)什么也没有发生。
下面是我的一些代码,如果有什么需要澄清的请不要犹豫!
这是table\u生成器类代码(一旦它正常工作,我会清理它!)

  1. public class Table_Builder extends Framework
  2. {
  3. private DefaultTableModel updated_table_model;
  4. private JTable updated_table;
  5. private JScrollPane table;
  6. public Table_Builder()
  7. {
  8. // no implemention needed
  9. }
  10. public Table_Builder(Vector rows, Vector columns)
  11. {
  12. updated_table_model = new DefaultTableModel(rows, columns);
  13. updated_table = new JTable(updated_table_model);
  14. updated_table.setCellSelectionEnabled(true);
  15. updated_table.setFillsViewportHeight(false);
  16. table = new JScrollPane(updated_table);
  17. JPanel tab2 = new JPanel();
  18. tab2.add(table);
  19. tab2.setVisible(true);
  20. center.add("Table Viewer", tab2);
  21. // I'm thinking some sort of listener needs to be active, so it knows I'm adding a new
  22. // tab, but I'm not sure how this actually works.
  23. center.addPropertyChangeListener("foregroud", null);
  24. center.repaint();
  25. // center has already been added to container so i don't think that needs to be done again?
  26. }

框架

  1. protected void center_panel()
  2. {
  3. JPanel tab1 = new JPanel();
  4. tab1.add(//emitted);
  5. center.setPreferredSize(new Dimension(1340, 950));
  6. center.setBackground(new Color(90, 90, 90));
  7. center.addTab("Tab1", tab1);
  8. container.add(center, BorderLayout.CENTER);
  9. }

祝你好运,迈克
更新:
framework有这些变量,我用它们来构建“framework”框架是一个边界布局(东、西、北、南、中)

  1. protected JTabbedPane center // this is the center panel
  2. protected Container container // this will house all panels to be added

如上所述,我目前正在添加选项卡
1.)创建一个新的jpanel 2.)将(需要显示的内容)添加到jpanel 3.)将该jpanel添加到jtabbedpane
这是由

  1. center.addTab("Tab name here", panel to be added);

javadoc说

  1. center.addTab("String title", Component component);

我遇到的问题是,这是在服务器连接之前完成的。在用户连接到服务器之后,我想添加一个新的选项卡,这个选项卡是从table\u builder中完成的,它继承自framework(这就是为什么center和container是受保护的,而不是私有的)。

voase2hg

voase2hg1#

在中心调用revalidate(),然后重新绘制。

vof42yt1

vof42yt12#

在构造函数中添加选项卡的代码如下所示:

  1. JPanel tab2 = new JPanel();
  2. tab2.add(table);
  3. tab2.setVisible(true);
  4. center.add("Table Viewer", tab2);
  5. // I'm thinking some sort of listener needs to be active, so it knows I'm adding a new
  6. // tab, but I'm not sure how this actually works.
  7. center.addPropertyChangeListener("foregroud", null);
  8. center.repaint();

有两个错误和许多不必要的行。错误包括: center.add("Table Viewer", tab2); 正在使用 add 系统的功能 Container 班级。当你想使用 center.addTab("Table Viewer", tab2); .
为了澄清@peeskillet所指出的问题,这里没有“foreground”属性,也没有“forgfround”(根据您的评论),而是“foreground”属性。
现在您需要做的是:

  1. JPanel tab2 = buildTableViewerTab();
  2. center.addTab("Table Viewer", tab2);

哪里 buildTableViewerTab() (返回jpanel)是创建所需jpanel所必需的代码。只需创建组件并将其正确添加到tabbedpane。
下面是一个简单的可执行应用程序,演示此代码的工作原理。同样,@peeskillet在他的第二条评论中要求你做同样的例子,但是用你自己的方式,用你的代码演示你遇到的错误。虽然这样做你可能会找到他们。

  1. import java.awt.BorderLayout;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import javax.swing.JButton;
  5. import javax.swing.JFrame;
  6. import javax.swing.JLabel;
  7. import javax.swing.JPanel;
  8. import javax.swing.JTabbedPane;
  9. import javax.swing.SwingUtilities;
  10. public class AddTabsExample
  11. {
  12. public static final void main(String[] args)
  13. {
  14. SwingUtilities.invokeLater(new Runnable()
  15. {
  16. public void run()
  17. {
  18. new AddTabsExample();
  19. }
  20. });
  21. }
  22. public AddTabsExample()
  23. {
  24. JFrame frame = new JFrame("Tab adder frame");
  25. final JTabbedPane tabbedPane = new JTabbedPane();
  26. frame.add(tabbedPane);
  27. JButton addButton = new JButton("Add tab");
  28. addButton.addActionListener(new ActionListener()
  29. {
  30. @Override
  31. public void actionPerformed(ActionEvent arg0)
  32. {
  33. JPanel newTabComponent = new JPanel();
  34. int tabCount = tabbedPane.getTabCount();
  35. newTabComponent.add(new JLabel("I'm tab " + tabCount));
  36. tabbedPane.addTab("Tab " +tabCount, newTabComponent);
  37. }
  38. });
  39. frame.add(addButton, BorderLayout.SOUTH);
  40. addButton.doClick(); //add the first tab
  41. frame.setSize(800, 300);//frame.pack();
  42. frame.setLocationRelativeTo(null);
  43. frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  44. frame.setVisible(true);
  45. }
  46. }

执行结果:

展开查看全部

相关问题