2013-06-21 4 views
1

У меня есть JTable с некоторыми данными, как этот SSCCE:Как добавить JButton после JTable

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.io.*; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.*; 
import java.awt.Color; 
class kanji{ 
    public static void main(String args[]){ 
     JFrame frame = new JFrame("Kanji"); 
     JPanel pane = new JPanel(); 
     JTable table = new JTable(); 
     pane.setLayout(new BorderLayout()); 
     JButton agreg = new JButton("Agregar");   
     DefaultTableModel model = new DefaultTableModel(get_data(), get_header());  
     JFrame hk = new JFrame("Historial de Significados"); 
     Image icon = Toolkit.getDefaultToolkit().getImage("JLPT.jpg"); 
     ImageIcon ima = new ImageIcon("JLPT.jpg"); 
     table = new JTable(model){ 
      @Override 
      public boolean isCellEditable(int row, int col){ 
       switch(col){ 
        case 0: 
         return false; 
        case 1: 
         return false; 
        case 2: 
         return true; 
        default: 
         return false; 
       } 
      } 
      @Override 
      public Class getColumnClass(int column) { 
       switch (column) { 
        case 0: 
         return String.class; 
        case 1: 
         return String.class; 
        case 2: 
         return Boolean.class; 
        default: 
         return Boolean.class; 
       } 
      } 
     }; 
     DefaultTableCellRenderer r = new DefaultTableCellRenderer() { 
      @Override 
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
       super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
       setForeground(Color.blue); 
       setHorizontalAlignment(JLabel.CENTER); 
       setFont(new Font("Microsoft JhengHei", Font.BOLD, 50)); 
       return this; 
      } 
     }; 
     DefaultTableCellRenderer r2 = new DefaultTableCellRenderer() { 
      @Override 
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
       super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
       setHorizontalAlignment(JLabel.LEFT); 
       setFont(new Font("Microsoft JhengHei", Font.BOLD, 13)); 
       return this; 
      } 
     }; 
     table.getColumnModel().getColumn(0).setCellRenderer(r); 
     table.getColumnModel().getColumn(1).setCellRenderer(r2); 
     TableColumn column = null; 
     for (int i = 0; i < 3; i++) { 
      column = table.getColumnModel().getColumn(i); 
      if (i==0) { 
       column.setMaxWidth(80); 
       column.setMinWidth(80); 
      } 
      else{ 
       if(i==1){ 
        column.setPreferredWidth(470); 
       } 
       else{ 
        column.setMaxWidth(50); 
        column.setMinWidth(50); 
       } 
      } 
     } 
     table.setRowHeight(table.getRowHeight()+70); 
     table.setModel(model); 
     table.getTableHeader().setReorderingAllowed(false); 
     JScrollPane scroll = new JScrollPane(table); 
     pane.add(scroll, BorderLayout.CENTER); 
     pane.add(agreg, BorderLayout.SOUTH); 
     frame.add(pane); 
     frame.setTitle("Historial de Significados"); 
     frame.setSize(1350, 700); 
     frame.setIconImage(icon); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     scroll.setViewportView(table); 
    } 
    public static Object [][]get_data(){ 
     Object data[][] = new Object[][]{ 
      {"\u4e00", "Uno, 1", true}, 
      {"\u4e01", "Uno, 1", true}, 
      {"\u4e02", "Uno, 1", true}, 
      {"\u4e03", "Uno, 1", true}, 
      {"\u4e04", "Uno, 1", true}, 
      {"\u4e05", "Uno, 1", true}, 
      {"\u4e06", "Uno, 1", true}, 
      {"\u4e07", "Uno, 1", true}, 
      {"\u4e08", "Uno, 1", true}, 
      {"\u4e09", "Uno, 1", true} 
     }; 
     return data; 
    } 
    public static String []get_header(){ 
     String header [] = new String[]{"KANJI", "SIGNIFICADO", "Agregar"}; 
     return header; 
    } 
} 

Но я хочу добавить 3 JButton после JTable создан, я хочу иметь JTable, которые не взять весь размер JFrame, в моем коде я получаю кнопку, но я хочу иметь возможность устанавливать границы кнопок.

Я попытался добавить JPanel и с другой попыткой с помощью «setPreferredSize», где JScrollPane не работает, я имею в виду, что я не отображается, поэтому я не вижу все содержимое таблицы; и я также пробовал с «setSize», который не работает для меня.

Возможно, мне нужно сделать вторую панель или что-то в этом роде, надеюсь, вы поможете мне решить эту проблему.

Я думаю изображение говорит больше, чем 1000 слов, так:

Это то, что я получаю, и есть, и то, что я хочу иметь

enter image description here

Таким образом, в простом английском языке, все, что я хочу знать, как визуализировать таблицу и добавить кнопку внизу после отображаемой таблицы (но я не хочу, чтобы кнопки имели всю ширину кадра, я хочу, чтобы они отсутствовали из таблицы, а не вместе, поскольку у меня есть их и с возможностью изменения их размер и положение).

+0

Почему, во имя Гадеса сделал кто-то вниз-голосование этот вопрос ?? –

+0

@HovercraftFullOfEels Я не знаю, как это было 8-12 месяцев назад, кто-то просто понизил его, и я был как ... почему? – Frakcool

ответ

8

enter image description here

private void createUI() { 
     JFrame frame = new JFrame(); 

     frame.setLayout(new BorderLayout()); 

     final JTable table = new JTable(10, 4); 

     JPanel btnPnl = new JPanel(new BorderLayout()); 
     JPanel topBtnPnl = new JPanel(new FlowLayout(FlowLayout.TRAILING)); 
     JPanel bottombtnPnl = new JPanel(new FlowLayout(FlowLayout.CENTER)); 

     topBtnPnl.add(new JButton("Select All")); 
     bottombtnPnl.add(new JButton("Cancel")); 
     bottombtnPnl.add(new JButton("Add Selected")); 

     btnPnl.add(topBtnPnl, BorderLayout.NORTH); 
     btnPnl.add(bottombtnPnl, BorderLayout.CENTER); 

     table.getTableHeader().setReorderingAllowed(false); 



     frame.add(table.getTableHeader(), BorderLayout.NORTH); 
     frame.add(table, BorderLayout.CENTER); 
     frame.add(btnPnl, BorderLayout.SOUTH); 

     frame.setTitle("JTable Example."); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
+1

+1 для использования макета; Я предложил обновить модель [здесь] (http://stackoverflow.com/a/17230777/230513). – trashgod

1

Вы можете взглянуть на GridLayout.

Короче я сделал некоторые изменения в свой класс, и я получил это:

  • Первая группа все JButtons в JPanel, которые имеют GridLayout внутри
  • Кроме того, ваш JFrame контейнер должен иметь BorderLayout
  • Поэтому вам нужно добавить каждую кнопку на вспомогательную панель и в конце добавить к кадру как JPanels.

Вот код:

//Another import sentences 
import java.awt.GridLayout; 

class kanji{ 
    public static void main(String args[]){ 
     // More code goes here 
     JPanel allowedOperations = new JPanel(new GridLayout(2, 2)); 
     pane.setLayout(new BorderLayout()); 
     // More code goes here 

     // All buttons are grouped here 
     allowedOperations.add(new JButton()); // Here's a trick 
     allowedOperations.add(agreg); 
     allowedOperations.add(new JButton("Save selected")); 
     allowedOperations.add(new JButton("Cancel")); 

     // Add the pane object to the frame 
     frame.add(pane, BorderLayout.CENTER); 

     // And finally add the allowedOperations object to the frame 
     frame.add(allowedOperations, BorderLayout.SOUTH); 
     // More code goes here 
} //End class 

Я просто разместил изменения, так что вам нужно сгруппировать весь класс.

Я знаю, что это не лучший подход, но вы можете улучшить свой код здесь. Кроме того, обратите внимание, вы можете создавать свои кнопки, прежде чем добавлены в allowedOperations панели, как кнопка agreg

+0

'JTable' будет лучше масштабироваться по мере роста модели. – trashgod

2

CheckABunch пример, который показывает, как обновить TableModel на основе текущего выбора.

image