2017-02-28 3 views
-2

Ich habe ein Problem mit einer JFrame nicht zeigt eine JTable, die hinzugefügt wird. Ich habe versucht getContentPane().add(..), ich habe einfach nur hinzugefügt, um den Code ein wenig kürzer zu halten. Jede Hilfe ist mehr als willkommen!JTable nicht auf JFrame (Java)

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

Nun, 'setLayout (null);' würde der Beginn Ihrer Probleme sein - Tabellen sind in der Regel auch in 'JScrollPane's gewickelt werden wie – MadProgrammer

+0

Sie habe vergessen, 'scrollPane.setLocation (...)' und 'scrollPane.setSize (...)' aufzurufen. Dies ist erforderlich, weil Sie sich entschieden haben, 'setLayout (null)' zu verwenden. Ich hoffe, Sie verstehen jetzt, dass das Vermeiden von LayoutManagern eine schlechte Entscheidung war. –

+0

@ MadProgrammer - Ich weiß, das ist nicht das Problem, weil alles andere gut aussieht. @ Thomas Got ya krank versuchen, dass danke Mann! – Kushroom

Antwort

4

Ich weiß, das ist nicht das Problem tho, weil alles andere ganz gut zeigt sich

Oh ... wirklich? Nicht in meinem Computer ...

Lasst uns ein Bild von Ihrem tatsächlichen GUI in meinem PC gezeigt haben:

enter image description here

Ist die GUI das gleiche in Ihrem Computer aussieht? Ich wette, nein.

Aber ... warum sieht das in meinem PC so aus?

Nun, wie oben in den Kommentaren von @MadProgrammer angegeben ist dies wegen der setLayout(null); Linie. Vielleicht möchten Sie Null layout is evil und Why is it frowned upon to use a null layout in Java Swing? für weitere Informationen lesen.

Nun, das soll gesagt werden, sollten Sie auch lesen und lernen, wie Sie die verschiedenen layout managers verwenden, mit denen Sie komplexe GUIs erstellen können.

In Ihrem Code setzen Sie niemals die Lage/Schranken für scrollPane und die Größe davon, so dass die Komponente hat eine Standardgröße von 0, 0.

Aber ... Ich denke, es ist besser, Ihnen zu zeigen, wie man eine wirklich ähnliche GUI bekommt (ich habe es eilig, also habe ich keine noch ähnlichere GUI erstellt). Sie können meinen Code kopieren und einfügen und sehen die gleiche Ausgabe (mit leichten Unterschieden wegen des OS vielleicht), aber Text wird nicht beschnitten.

enter image description here

Der Code, der das obige Bild erzeugt, ist diese:

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

Auch haben Sie vielleicht bemerkt, dass die main() Methode unterschiedlich ist, na ja, der Code innerhalb sie das Programm platzieren auf der Event Dispatch Thread (EDT).

Also, seien Sie sicher, dass es in Ihrer zukünftigen Programme aufzunehmen

+0

* "so hat die Komponente eine preferredSize von 0, 0." * - Eigentlich hätte es wahrscheinlich eine bevorzugte Größe, es hat einfach keine physikalische Größe (oder hat eine Standardgröße von '0x0 ') – MadProgrammer

+0

@MadProgrammer Woops! Danke für die Rückmeldung. Fixed it :) – Frakcool

+0

Ich kann nicht sagen, danke genug Leute, Entschuldigung, ich war so stur, um euch früher zu hören. Ich versuche nur, eine nette GUI zu machen und ich habe den ganzen Tag versucht, es zur Arbeit zu bringen und ich war sehr verärgert. Frak, du hast mir gezeigt, dass das setLayout (null) sehr schrecklich ist und nicht gemacht werden sollte. Ich kann Ihnen nicht genug danken für Ihre Hilfe! Ich bin sehr dankbar für Ihre Beiträge! – Kushroom