在我的主类中初始化JTabbedpane时一切正常,但是为了不重复重复相同的代码,我想将初始化部分移动到单独的类,这样我就可以轻松地创建新的选项卡而不生成再次使用相同的代码。 不幸的是,在将代码移动到单独的类之后,JTabbedpane未正确创建,因为未显示添加到列表的项目。看起来JPanel没有加载,因为选项卡下的屏幕是灰色的(当它工作时它是白色的)。
以下是有效的代码:
private void initialize() {
frmLoganalyzer = new JFrame();
frmLoganalyzer.setTitle("LogAnalyzer");
frmLoganalyzer.setBounds(100, 100, 450, 300);
frmLoganalyzer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmLoganalyzer.setExtendedState(frmLoganalyzer.getExtendedState() | JFrame.MAXIMIZED_BOTH);
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
frmLoganalyzer.getContentPane().add(tabbedPane, BorderLayout.CENTER);
JPanel systemLogTab = new JPanel();
tabbedPane.addTab("System Log", null, systemLogTab, null);
DefaultListModel listModel = new DefaultListModel<LogSystem>();
systemLogTab.setLayout(new BorderLayout(0, 0));
JList list = new JList(listModel);
list.setCellRenderer(new CustomListCellRenderer());
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
list.setVisibleRowCount(-1);
JScrollPane listScroller = new JScrollPane(list);
listScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
listScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
systemLogTab.add(listScroller);
}
我试图把它看起来像这样:
private void initialize() {
frmLoganalyzer = new JFrame();
frmLoganalyzer.setTitle("LogAnalyzer");
frmLoganalyzer.setBounds(100, 100, 450, 300);
frmLoganalyzer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmLoganalyzer.setExtendedState(frmLoganalyzer.getExtendedState() | JFrame.MAXIMIZED_BOTH);
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
frmLoganalyzer.getContentPane().add(tabbedPane, BorderLayout.CENTER);
TabManager tabManager = new TabManager(tabbedPane);
DefaultListModel listModel = new DefaultListModel<LogSystem>();
tabManager.addTab("System Log", null, listModel);
}
在初学化标签的课程中:
public void addTab(String tabName, Icon icon, DefaultListModel<LogSystem> listModel) {
JPanel systemLogTab = new JPanel();
tabbedPane.addTab(tabName, null, systemLogTab, null);
systemLogTab.setLayout(new BorderLayout(0, 0));
JList<LogSystem> list = new JList(listModel);
list.setCellRenderer(new CustomListCellRenderer());
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
list.setVisibleRowCount(-1);
JScrollPane listScroller = new JScrollPane(list);
listScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
listScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
systemLogTab.add(listScroller);
}
我做错了什么?
答案 0 :(得分:0)
我删除了许多与GUI无关的代码,并且必须更改addTab
方法定义,因为tabbedPane
不可见。它工作正常:
public class Example {
@SuppressWarnings("serial")
private static void initialize() {
JFrame frmLoganalyzer = new JFrame();
frmLoganalyzer.setTitle("LogAnalyzer");
frmLoganalyzer.setBounds(100, 100, 450, 300);
frmLoganalyzer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTabbedPane tabbedPane = new JTabbedPane();
frmLoganalyzer.getContentPane().add(tabbedPane);
JPanel systemLogTab = new JPanel();
tabbedPane.addTab("System Log", null, systemLogTab, null);
systemLogTab.setLayout(new BorderLayout());
JList list = new JList();
JScrollPane listScroller = new JScrollPane(list);
systemLogTab.add(listScroller);
frmLoganalyzer.setVisible(true);
}
private static void initialize2() {
JFrame frmLoganalyzer = new JFrame();
frmLoganalyzer.setTitle("LogAnalyzer");
frmLoganalyzer.setBounds(100, 100, 450, 300);
frmLoganalyzer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTabbedPane tabbedPane = new JTabbedPane();
frmLoganalyzer.getContentPane().add(tabbedPane);
addTab("System Log", tabbedPane);
frmLoganalyzer.setVisible(true);
}
public static void addTab(String tabName, JTabbedPane tabbedPane) {
JPanel systemLogTab = new JPanel();
tabbedPane.addTab(tabName, null, systemLogTab, null);
systemLogTab.setLayout(new BorderLayout());
JList list = new JList();
JScrollPane listScroller = new JScrollPane(list);
systemLogTab.add(listScroller);
}
public static void main(String[] args) {
initialize(); // call initialize2() and see that it's the same
}
}