JTable не отображается на JFrame (Java)

У меня проблема с JFrame не показывающим JTable который добавлен к нему. Я попытался getContentPane().add(..) , я переключился, чтобы просто добавить, чтобы код был короче. Любая помощь более чем оценена!

 package com.embah.Accgui; import java.awt.*; import javax.swing.*; public class accCreator extends JFrame { private String[] columnNames = {"Username", "Password", "Members", "World"}; private Object[][] data = {{"b", "b", "b", "b"}, { "e", "e", "e", "e"}}; private JTable tbl_Accounts; private JScrollPane scrollPane; private JLabel lbl_Account = new JLabel(); private JLabel lbl_Username = new JLabel(); private JLabel lbl_Password = new JLabel(); private JLabel lbl_Homeworld = new JLabel(); private JButton btn_Select = new JButton(); private JButton btn_Addacc = new JButton(); private JButton btn_Delacc = new JButton(); private JTextArea txt_Username = new JTextArea(); private JTextArea txt_Password = new JTextArea(); private JTextArea txt_Homeworld = new JTextArea(); private JCheckBox cbox_Members = new JCheckBox(); private JCheckBox cbox_RanWrld = new JCheckBox(); public accCreator() { setLayout(null); setupGUI(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } void setupGUI() { tbl_Accounts = new JTable(data, columnNames); tbl_Accounts.setLocation(5, 30); tbl_Accounts.setPreferredScrollableViewportSize(new Dimension(420, 250)); tbl_Accounts.setFillsViewportHeight(true); tbl_Accounts.setVisible(true); add(tbl_Accounts); scrollPane = new JScrollPane(tbl_Accounts); add(scrollPane); lbl_Account.setLocation(4, 5); lbl_Account.setSize(100, 20); lbl_Account.setText("Select Account:"); add(lbl_Account); lbl_Username.setLocation(5, 285); lbl_Username.setSize(70, 20); lbl_Username.setText("Username:"); add(lbl_Username); lbl_Password.setLocation(5, 310); lbl_Password.setSize(70, 20); lbl_Password.setText("Password:"); add(lbl_Password); lbl_Homeworld.setLocation(310, 310); lbl_Homeworld.setSize(80, 20); lbl_Homeworld.setText("Home World:"); add(lbl_Homeworld); btn_Select.setLocation(305, 5); btn_Select.setSize(120, 20); btn_Select.setText("Select Account"); add(btn_Select); btn_Addacc.setLocation(300, 285); btn_Addacc.setSize(60, 20); btn_Addacc.setText("Add"); btn_Addacc.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { String worldSel = ""; if(cbox_RanWrld.isSelected()){ worldSel = "Random"; } else { worldSel = txt_Homeworld.getText(); } Object[] row = {txt_Username.getText(), txt_Password.getText(), cbox_Members.isSelected(), worldSel}; DefaultTableModel model = (DefaultTableModel) tbl_Accounts.getModel(); model.addRow(row); } }); add(btn_Addacc); btn_Delacc.setLocation(365, 285); btn_Delacc.setSize(60, 20); btn_Delacc.setText("Del"); btn_Delacc.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { DefaultTableModel model = (DefaultTableModel) tbl_Accounts.getModel(); } }); add(btn_Delacc); txt_Username.setLocation(80, 285); txt_Username.setSize(100, 20); txt_Username.setText(""); txt_Username.setRows(5); txt_Username.setColumns(5); add(txt_Username); txt_Password.setLocation(80, 310); txt_Password.setSize(100, 20); txt_Password.setText(""); txt_Password.setRows(5); txt_Password.setColumns(5); txt_Password.setTabSize(0); add(txt_Password); txt_Homeworld.setLocation(395, 310); txt_Homeworld.setSize(30, 20); txt_Homeworld.setText("82"); txt_Homeworld.setRows(5); txt_Homeworld.setColumns(5); txt_Homeworld.setTabSize(0); add(txt_Homeworld); cbox_Members.setLocation(185, 285); cbox_Members.setSize(80, 20); cbox_Members.setText("Members"); cbox_Members.setSelected(false); add(cbox_Members); cbox_RanWrld.setLocation(185, 310); cbox_RanWrld.setSize(115, 20); cbox_RanWrld.setText("Random World"); cbox_RanWrld.setSelected(false); add(cbox_RanWrld); setTitle("Account Manager"); setSize(440, 370); setVisible(true); setResizable(false); } public static void main(String args[]) { new accCreator(); } } 

Я знаю, что это не проблема, потому что все остальное проявляется просто отлично

Да неужели? Не в моем компьютере …

Давайте посмотрим на ваш фактический графический интерфейс, показанный на моем ПК:

введите описание изображения здесь

Является ли GUI одинаковым на вашем компьютере? Держу пари, нет.

Но … почему это похоже на моем ПК?

Ну, как указано выше в комментариях @MadProgrammer, это из-за setLayout(null); линия. Возможно, вы захотите прочитать Null layout is evil и почему он недоволен использованием нулевого макета в Java Swing? Чтобы получить больше информации.

Теперь, говоря, вы также должны прочитать и узнать, как использовать различные менеджеры макетов , которые позволят вам создавать сложные графические интерфейсы.

В вашем коде вы никогда не устанавливаете местоположение / границы для scrollPane и его размер, поэтому у компонента есть размер по умолчанию 0, 0.

Но … Я думаю, что лучше показать вам, как вы можете получить действительно похожий графический интерфейс (я спешу, поэтому я не сделал еще более похожий графический интерфейс). Вы можете скопировать мой код и увидеть тот же результат (с небольшими различиями из-за ОС), но текст не будет обрезан.

введите описание изображения здесь

Код, который создает вышеупомянутое изображение, следующий:

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridLayout; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class AccountCreator { private JFrame frame; private JPanel mainPane; private JPanel topPane; private JPanel tablePane; private JPanel bottomPane; private JLabel selectAccountLabel; private JLabel userNameLabel; private JLabel passwordLabel; private JLabel homeWorldLabel; private JTextField userNameField; private JTextField homeWorldField; private JPasswordField passwordField; private JCheckBox membersBox; private JCheckBox randomBox; private JButton selectAccountButton; private JButton addButton; private JButton deleteButton; private JTable table; private JScrollPane scroll; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new AccountCreator().createAndShowGui(); } }); } public void createAndShowGui() { frame = new JFrame(getClass().getSimpleName()); int rows = 30; int cols = 3; String[][] data = new String[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { data[i][j] = i + "-" + j; } } String[] columnNames = { "Column1", "Column2", "Column3" }; table = new JTable(data, columnNames); scroll = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); table.setPreferredScrollableViewportSize(new Dimension(420, 250)); table.setFillsViewportHeight(true); selectAccountLabel = new JLabel("Select Account"); userNameLabel = new JLabel("Username: "); passwordLabel = new JLabel("Password: "); homeWorldLabel = new JLabel("Home world"); selectAccountButton = new JButton("Select Account"); addButton = new JButton("Add"); deleteButton = new JButton("Del"); userNameField = new JTextField(10); passwordField = new JPasswordField(10); homeWorldField = new JTextField(3); membersBox = new JCheckBox("Members"); randomBox = new JCheckBox("Random world"); topPane = new JPanel(); topPane.setLayout(new BorderLayout()); topPane.add(selectAccountLabel, BorderLayout.WEST); topPane.add(selectAccountButton, BorderLayout.EAST); tablePane = new JPanel(); tablePane.add(scroll); bottomPane = new JPanel(); bottomPane.setLayout(new GridLayout(0, 5, 3, 3)); bottomPane.add(userNameLabel); bottomPane.add(userNameField); bottomPane.add(membersBox); bottomPane.add(addButton); bottomPane.add(deleteButton); bottomPane.add(passwordLabel); bottomPane.add(passwordField); bottomPane.add(randomBox); bottomPane.add(homeWorldLabel); bottomPane.add(homeWorldField); mainPane = new JPanel(); mainPane.setLayout(new BoxLayout(mainPane, BoxLayout.PAGE_AXIS)); frame.add(topPane, BorderLayout.NORTH); frame.add(tablePane, BorderLayout.CENTER); frame.add(bottomPane, BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } кнопка import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridLayout; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class AccountCreator { private JFrame frame; private JPanel mainPane; private JPanel topPane; private JPanel tablePane; private JPanel bottomPane; private JLabel selectAccountLabel; private JLabel userNameLabel; private JLabel passwordLabel; private JLabel homeWorldLabel; private JTextField userNameField; private JTextField homeWorldField; private JPasswordField passwordField; private JCheckBox membersBox; private JCheckBox randomBox; private JButton selectAccountButton; private JButton addButton; private JButton deleteButton; private JTable table; private JScrollPane scroll; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new AccountCreator().createAndShowGui(); } }); } public void createAndShowGui() { frame = new JFrame(getClass().getSimpleName()); int rows = 30; int cols = 3; String[][] data = new String[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { data[i][j] = i + "-" + j; } } String[] columnNames = { "Column1", "Column2", "Column3" }; table = new JTable(data, columnNames); scroll = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); table.setPreferredScrollableViewportSize(new Dimension(420, 250)); table.setFillsViewportHeight(true); selectAccountLabel = new JLabel("Select Account"); userNameLabel = new JLabel("Username: "); passwordLabel = new JLabel("Password: "); homeWorldLabel = new JLabel("Home world"); selectAccountButton = new JButton("Select Account"); addButton = new JButton("Add"); deleteButton = new JButton("Del"); userNameField = new JTextField(10); passwordField = new JPasswordField(10); homeWorldField = new JTextField(3); membersBox = new JCheckBox("Members"); randomBox = new JCheckBox("Random world"); topPane = new JPanel(); topPane.setLayout(new BorderLayout()); topPane.add(selectAccountLabel, BorderLayout.WEST); topPane.add(selectAccountButton, BorderLayout.EAST); tablePane = new JPanel(); tablePane.add(scroll); bottomPane = new JPanel(); bottomPane.setLayout(new GridLayout(0, 5, 3, 3)); bottomPane.add(userNameLabel); bottomPane.add(userNameField); bottomPane.add(membersBox); bottomPane.add(addButton); bottomPane.add(deleteButton); bottomPane.add(passwordLabel); bottomPane.add(passwordField); bottomPane.add(randomBox); bottomPane.add(homeWorldLabel); bottomPane.add(homeWorldField); mainPane = new JPanel(); mainPane.setLayout(new BoxLayout(mainPane, BoxLayout.PAGE_AXIS)); frame.add(topPane, BorderLayout.NORTH); frame.add(tablePane, BorderLayout.CENTER); frame.add(bottomPane, BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 

Кроме того, вы могли заметить, что метод main() отличается, ну, код внутри него помещает программу в Thread Dispatch Thread (EDT) .

Поэтому обязательно включите его в свои будущие программы

  • Производительность JavaFx Gui vs Swing
  • Добавьте JLabel с изображением в JList, чтобы показать все изображения
  • Масштабируйте ImageIcon автоматически до размера метки
  • Рисование объекта с использованием getGraphics () без расширения JFrame
  • Попытка создания JTable с правильным заголовком строки
  • Java / Swing: JTextArea в JScrollPane, как предотвратить автоматическую прокрутку?
  • Почему первая панель, добавленная к кадру, исчезает?
  • Проблема с отображением графического интерфейса AbstractTableModel
  • Как использовать собственный редактор ячеек JTable и средство отображения ячеек
  • Java - Как создать настраиваемое диалоговое окно?
  • Почему мой JLabel не появляется
  • Давайте будем гением компьютера.