Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
234 views
in Technique[技术] by (71.8m points)

swing - JTable not showing up on JFrame (Java)

I'm having a problem with a JFrame not showing a JTable that is added to it. I've tried getContentPane().add(..), I've switched to just add to keep the code a little shorter. Any help is more than appreciated!

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();
}
}
Question&Answers:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I know thats not the problem tho because everything else shows up just fine

Oh... really? Not in my computer...

Let's have a picture of your actual GUI shown in my PC:

enter image description here

Does the GUI looks the same in your computer? I bet no.

But... why does it looks like that in my PC?

Well, as stated above in the comments by @MadProgrammer this is because of the setLayout(null); line. You might want to read Why is it frowned upon to use a null layout in Java Swing? for more information.

Now, that being said, you should also want to read and learn how to use the various layout managers that will let you create complex GUIs.

In your code you never set the location / bounds for scrollPane, and the size of it, so the component has a default size of 0, 0.

But... I think it's better to show you how you can get a really similar GUI (I'm in a hurry so I didn't make an even more similar GUI). You can copy-paste my code and see the same output (with slight differences because of the OS maybe) but text won't be cropped.

enter image description here

The code that produces the above image is this one:

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

Also, you might have noticed that the main() method is different, well, the code inside it is placing the program on the Event Dispatch Thread (EDT).

So, be sure to include it in your future programs


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...