如何在JTable之后添加JButton [英] How to add JButton after a JTable

查看:64
本文介绍了如何在JTable之后添加JButton的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个JTable,其中包含一些类似于SSCCE的数据:

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

但是我想在创建JTable之后添加3个JButton,我想拥有一个不占用所有JFrame大小的JTable,在我的代码中我得到一个Button,但是我希望可以设置按钮界限. /p>

我尝试添加一个JPanel,然后尝试使用"setPreferredSize"进行尝试,其中JScrollPane不起作用,我的意思是我没有出现,所以看不到所有表内容.并且我还尝试了对我不起作用的"setSize".

也许我必须再做一个小组讨论,希望您能帮助我解决这个问题.

我猜一个图像说了1000多个字,所以:

这就是我所拥有和拥有的以及我想要拥有的东西

所以用通俗的英语来说,我只想知道如何渲染表格并在渲染表格之后在底部添加按钮(但是我不希望按钮具有所有的框架宽度,我希望它们远离表格,而不是一起使用,并可以更改其大小和位置.

解决方案

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

I have a JTable with some data like this SSCCE:

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

But I want to add 3 JButton after JTable is created, I want to have a JTable that don't take all JFrame size, in my code I get a Button but I want to have the possibility to set buttons bounds.

I've tried adding a JPanel and with another try with "setPreferredSize" where JScrollPane don't work, I mean I doesn't appear so I can't see all table content; and I also tried with "setSize" that doesn't work for me.

Maybe I have to make a second panel or something like that, I hope you can help me solving this issue.

I guess an Image says more than 1,000 words, so:

This is what I get and have and what I want to have

So in plain english, all I want to know is how to render table and add button at the bottom after rendered table (but I don't want buttons to have all the frame width, I want them away from table, not together as I have them and with the possibility to change their size and position).

解决方案

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

这篇关于如何在JTable之后添加JButton的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆