我正在研究一个项目,并且遇到了一些逻辑错误,希望你们其中一个可以解决这个问题。
我正在构建一个显示SQL数据库的应用程序(除其他外)。目前,我设置的方式,我在Container(BorderLayout.CENTER)中有一个JTabbedPane,而不是这是真正相关的信息。
Anywho,我想在用户连接到数据库后添加一个标签(并最终选择要查看的'表'。但是现在只有一个表可以显示。
因此,当用户点击“连接”时,理想情况下连接将成功,此时JTable将填充数据库信息。
初始化此表并准备就绪后,将其添加到新的JPanel,并将该面板添加到JTabbedPane。
这就是错误的来源。我相信'到目前为止我的逻辑是正确的,我没有得到任何编译器/运行时错误,新的选项卡没有显示(如果我点击它应该在哪里没有任何反应。
以下是我的一些代码,如果需要澄清,请不要犹豫!
这是Table_Builder类代码(一旦它正常工作我会清理它!)
public class Table_Builder extends Framework
{
private DefaultTableModel updated_table_model;
private JTable updated_table;
private JScrollPane table;
public Table_Builder()
{
// no implemention needed
}
public Table_Builder(Vector rows, Vector columns)
{
updated_table_model = new DefaultTableModel(rows, columns);
updated_table = new JTable(updated_table_model);
updated_table.setCellSelectionEnabled(true);
updated_table.setFillsViewportHeight(false);
table = new JScrollPane(updated_table);
JPanel tab2 = new JPanel();
tab2.add(table);
tab2.setVisible(true);
center.add("Table Viewer", tab2);
// I'm thinking some sort of listener needs to be active, so it knows I'm adding a new
// tab, but I'm not sure how this actually works.
center.addPropertyChangeListener("foregroud", null);
center.repaint();
// center has already been added to container so i don't think that needs to be done again?
}
框架
protected void center_panel()
{
JPanel tab1 = new JPanel();
tab1.add(//emitted);
center.setPreferredSize(new Dimension(1340, 950));
center.setBackground(new Color(90, 90, 90));
center.addTab("Tab1", tab1);
container.add(center, BorderLayout.CENTER);
}
最诚挚的问候, 麦克
更新:
Framework有我用来构建'Frame'的这些变量 框架是边界布局(东,西,北,南,中)
protected JTabbedPane center // this is the center panel
protected Container container // this will house all panels to be added
如上所示,我目前正在添加标签
1。)创建一个新的JPanel 2.)向jpanel添加(无论需要显示什么) 3.)将jpanel添加到JTabbedPane
这是由
完成的center.addTab("Tab name here", panel to be added);
这个javadoc说
center.addTab("String title", Component component);
这符合预期,我遇到的问题是,这是在服务器连接之前完成的。在用户连接到服务器之后,我想添加一个新的选项卡,它是从Table_Builder完成的,它继承自Framework(这就是为什么中心和容器受到保护而不是私有的。)
答案 0 :(得分:1)
您在构造函数中添加选项卡的代码如下:
JPanel tab2 = new JPanel();
tab2.add(table);
tab2.setVisible(true);
center.add("Table Viewer", tab2);
// I'm thinking some sort of listener needs to be active, so it knows I'm adding a new
// tab, but I'm not sure how this actually works.
center.addPropertyChangeListener("foregroud", null);
center.repaint();
有2个错误和许多不必要的行。错误是:
center.add("Table Viewer", tab2);
正在使用add
类的Container
函数。如果您想使用center.addTab("Table Viewer", tab2);
。
为了清理@peeskillet指出的内容,没有“foregroud”属性,也没有“forground”(根据你的评论),而是“前景”属性。
< / LI>现在您需要做的只是以下内容:
JPanel tab2 = buildTableViewerTab();
center.addTab("Table Viewer", tab2);
buildTableViewerTab()
(返回JPanel)是创建所需JPanel所需的代码。只需创建组件并将其正确添加到tabbedPane。
要显示此代码如何工作,这是一个演示此功能的简单可执行应用程序。同样,@ pepekillet在第二次评论中问你的是做同样的例子,但是以你自己的方式和你的代码展示你遇到的错误。虽然这样做你可能会找到它们。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
public class AddTabsExample
{
public static final void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new AddTabsExample();
}
});
}
public AddTabsExample()
{
JFrame frame = new JFrame("Tab adder frame");
final JTabbedPane tabbedPane = new JTabbedPane();
frame.add(tabbedPane);
JButton addButton = new JButton("Add tab");
addButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0)
{
JPanel newTabComponent = new JPanel();
int tabCount = tabbedPane.getTabCount();
newTabComponent.add(new JLabel("I'm tab " + tabCount));
tabbedPane.addTab("Tab " +tabCount, newTabComponent);
}
});
frame.add(addButton, BorderLayout.SOUTH);
addButton.doClick(); //add the first tab
frame.setSize(800, 300);//frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
}
执行结果:
答案 1 :(得分:0)
在您的中心调用revalidate(),然后重新绘制。