2012-11-21 35 views
5

Tôi có nút hiển thị để hiển thị số JTable khi nhấp nhưng bảng không hiển thị. Lưu ý: khi tôi loại bỏ các JScrollPane mã hoạt động đúng nhưng tiêu đề của bảng không được hiển thị, vì vậy bất kỳ sự giúp đỡ xin vui lòng để làm cho công việc mã này đúng mà không cần tháo JScrollPanejScrollPane setVisible không hoạt động

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

Trả lời

8

Sau pane.setVisible(true); thêm như sau:

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

Hành vi mong đợi? Tại sao không phải là 'pane.setVisible (true);' một mình đủ? –

5

Một số điều cần lưu ý:

  • Không bao giờ kéo dài JFrame lớp không cần thiết, hoặc người nào khác bạn có thể cần phải mở rộng một lớp khác là rất cần thiết nhưng trong java một lớp duy nhất có thể không mở rộng nhiều hơn một lớp khác (không có nhiều thừa kế).

  • Luôn tạo thành phần Swing trên Event Dispatch Thread qua khối SwingUtilities.invokeLater(Runnable r).

  • Không sử dụng setSize(..) gọi JFrame#pack() trước khi thiết JFrame nhìn thấy

  • Không cần getContentPane.add(..) hoặc getContentPane().setLayout(..), chỉ cần gọi add(..) hoặc setLayout(..) trên JFrame dụ như các cuộc gọi được fowared đến ContentPane.

  • Sự cố bạn gặp phải là bạn không làm mới bạn có khung/vùng chứa sau khi cửa sổ thiết lập hiển thị. Tôi không đồng ý với @Dan. Không sử dụng validate() (getContentPane() không necesarry một trong hai) chứ không phải:

    revalidate(); 
    repaint(); 
    

như revalidate() bao gồm validate(). Ngoài ra xác nhận được sử dụng khi mới JComponent s được thêm vào một thành phần hiển thị, trong khi revalidate() được sử dụng khi JComponent được xóa/thêm từ thành phần hiển thị.

Đây là một phiên bản cố định của mã với thực hiện trên:

enter image description here

Sau khi nút nhấn:

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:

Ngoài ra để có thể sử dụng lại nhiều hơn Layout, tại sao không thêm tất cả các thành phần vào một số JPanel và thêm JPanel vào số JFrame, do đó nếu bạn cần thêm nhiều nội dung đơn giản hơn.

+2

+1 cho 'vài điều cần lưu ý:' và đầu ra hình ảnh có mô tả – exexzian

Các vấn đề liên quan