JTable no aparece en JFrame (Java)

Tengo un problema con un JFrame no muestra una JTable que se agrega. Intenté getContentPane().add(..) , getContentPane().add(..) para agregar solo y mantener el código un poco más corto. ¡Cualquier ayuda es más que apreciada!

 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(); } } 

Sé que ese no es el problema porque todo lo demás se muestra bien

¿Oh enserio? No en mi computadora …

Hagamos una foto de su GUI real que se muestra en mi PC:

enter image description here

¿La GUI tiene el mismo aspecto en su computadora? Apuesto que no.

Pero … ¿por qué se ve así en mi PC?

Bueno, como se indicó anteriormente en los comentarios de @MadProgrammer, esto se debe a setLayout(null); línea. Es posible que desee leer El diseño nulo es malo y ¿Por qué está mal visto utilizar un diseño nulo en Java Swing? para más información.

Ahora, dicho esto, también debería querer leer y aprender a usar los diversos administradores de diseño que le permitirán crear GUI complejas.

En su código, nunca establece la ubicación / límites para scrollPane , y el tamaño de la misma, por lo que el componente tiene un tamaño predeterminado de 0, 0.

Pero … creo que es mejor mostrarte cómo puedes obtener una GUI realmente similar (tengo prisa, así que no hice una GUI aún más similar). Puede copiar y pegar mi código y ver el mismo resultado (con ligeras diferencias debido al SO quizás), pero el texto no se recortará.

enter image description here

El código que produce la imagen de arriba es este:

 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); } } 

Además, es posible que haya notado que el método main() es diferente, bueno, el código dentro de él coloca el progtwig en el subproceso de envío de evento (EDT) .

Por lo tanto, asegúrese de incluirlo en sus progtwigs futuros