2012-11-21 10 views
5

Mam przycisk Pokaż, aby pokazać JTable po kliknięciu, ale tabela nie jest widoczna. Uwaga: kiedy wyjąć JScrollPane Kod działa poprawnie, ale nagłówek tabeli nie jest pokazany, więc każda pomoc prosimy aby to działało kodu właściwie bez wyjmowania JScrollPanejScrollPane setVisible nie działa

 import java.awt.event.ActionEvent; 
     import java.awt.event.ActionListener; 

     import javax.swing.JButton; 
     import javax.swing.JFrame; 
     import javax.swing.JScrollPane; 
     import javax.swing.JTable; 
     import javax.swing.table.DefaultTableModel; 

     public class Training extends JFrame { 

      public Training() { 

       getContentPane().setLayout(new FlowLayout()); 
       JTable table = new JTable(); 
       table.setModel(new DefaultTableModel(new Object[][] { { "joe", "joe" }, 
         { "mickel", "mickel" }, }, new String[] { "LastName", 
         "FirstName" })); 
       final JScrollPane pane = new JScrollPane(table); 
       pane.setVisible(false); 
       getContentPane().add(pane); 

       JButton btn = new JButton("show"); 
       add(btn); 
       btn.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         // TODO Auto-generated method stub 
         pane.setVisible(true); 
        } 
       }); 
      } 

      public static void main(String[] args) { 
       Training app = new Training(); 
       app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       app.setSize(600, 600); 
       app.setVisible(true); 
      } 
     } 

Odpowiedz

8

Po pane.setVisible(true); dodać następujące:

getContentPane().validate(); 
getContentPane().repaint(); 
+1

Czy to oczekiwane zachowanie? Dlaczego sama właściwość 'pane.setVisible (true) 'nie jest wystarczająca? –

5

kilka rzeczy do uwaga:

  • Nigdy rozciągaKlasaniepotrzebnie, lub może być konieczne rozszerzenie innej klasy, która jest bardzo potrzebna, ale w java pojedyncza klasa może nie rozszerzać więcej niż jednej innej klasy (bez dziedziczenia wielokrotnego).

  • Zawsze twórz komponenty Swing na Event Dispatch Thread przez blok SwingUtilities.invokeLater(Runnable r).

  • Nie używaj setSize(..) połączenia JFrame#pack() przed ustawieniem JFrame widoczne

  • Nie potrzeba getContentPane.add(..) lub getContentPane().setLayout(..), lub po prostu zadzwonić add(..)setLayout(..) na JFrame przykład jak te połączenia są fowared do ContentPane.

  • Problemem jest brak odświeżania Ramka/pojemnik po ustawieniu widocznego panelu. Nie zgadzam się z @Dan. Nie używaj validate() (getContentPane() nie necesarry albo) raczej:

    revalidate(); 
    repaint(); 
    

jak revalidate() obejmuje validate(). Sprawdzanie poprawności jest również używane, gdy nowe JComponent s są dodawane do widocznego składnika, natomiastjest używane, gdy JComponent jest usuwany/dodawany z widocznego komponentu.

Oto ustalona wersja kodu z powyższego realizowane:

enter image description here

Po naciśnięciu przycisku:

enter image description here

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 

public class Training { 

    private JFrame frame; 

    public Training() { 
     frame = new JFrame(); 
     frame.setLayout(new FlowLayout()); 
     JTable table = new JTable(); 
     table.setModel(new DefaultTableModel(new Object[][]{{"joe", "joe"}, 
        {"mickel", "mickel"},}, new String[]{"LastName", 
        "FirstName"})); 
     final JScrollPane pane = new JScrollPane(table); 
     pane.setVisible(false); 
     frame.add(pane); 

     JButton btn = new JButton("show"); 
     frame.add(btn); 

     btn.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       pane.setVisible(true); 

       frame.pack();//this is so the frame will resize after adding pane 
       frame.revalidate(); 
       frame.repaint(); 
      } 
     }); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Training(); 
      } 
     }); 
    } 
} 

UPDATE:

Również dla bardziej wielokrotnego użytku Layout, dlaczego nie dodać wszystkich składników do JPanel i dodać, że JPanel do JFrame, więc jeśli kiedykolwiek będziesz musiał dodać więcej rzeczy, to proste.

+2

+1 dla "kilku rzeczy do zapamiętania:" i obrazu wyjściowego z opisem – exexzian

Powiązane problemy