Menambahkan JScrollPane ke JTable

Hai, pertanyaan ini mungkin tampak seperti duplikat, tetapi sebenarnya bukan karena saya sudah mencoba saran pada pertanyaan stackoverflow lain seperti ini. Bisakah seseorang membantu saya men-debug kode saya, ini kode saya:

import java.awt.*;

import javax.swing.*;
import javax.swing.border.MatteBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

// This is the Panel that contains represents the view of the
// Music Store

public class PosPanel extends JPanel {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    // These are the components
    private JLabel      billNumber;
    private JButton     submitButton;
    private JButton     changeViewButton;
    private JButton     addItemButton;
    private JTable      table;



    public JButton getsubmitButton() {
        return submitButton;
    }

    public JLabel getBillNumber() {
        return billNumber;
    }
    public JButton getAddItemButton() {
        return addItemButton;
    }

    public JButton getChangeViewButton() {
        return changeViewButton;
    }
    public void setChangeViewButton(JButton changeViewButton) {
        this.changeViewButton = changeViewButton;
    }
    public JTable getTable() {
        return table;
    }

    public PosPanel(){
        super();

        // Use a GridBagLayout (lotsa fun)
        GridBagLayout layout = new GridBagLayout();
        GridBagConstraints layoutConstraints = new GridBagConstraints();
        setLayout(layout);

        billNumber = new JLabel("Invoice #1");
        layoutConstraints.gridx = 0;
        layoutConstraints.gridy = 0;
        layoutConstraints.gridwidth = 1;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(10, 10, 10, 10);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 0.05;
        layout.setConstraints(billNumber, layoutConstraints);
        add(billNumber);

        changeViewButton = new JButton("Exchange/Return");
        layoutConstraints.gridx = 1;
        layoutConstraints.gridy = 0;
        layoutConstraints.gridwidth = 1;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 0.05;
        layout.setConstraints(changeViewButton, layoutConstraints);
        add(changeViewButton);

        addItemButton = new JButton("Add Item");
        layoutConstraints.gridx = 2;
        layoutConstraints.gridy = 0;
        layoutConstraints.gridwidth = 1;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 0.05;
        layout.setConstraints(addItemButton, layoutConstraints);
        add(addItemButton);

        submitButton = new JButton("Submit");
        layoutConstraints.gridx = 0;
        layoutConstraints.gridy = 8;
        layoutConstraints.gridwidth = 3;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 0.05;
        layout.setConstraints(submitButton, layoutConstraints);
        add(submitButton);



        table = new JTable(new MyTableModel());
        int[] alignments = new int[] { JLabel.LEFT, JLabel.CENTER, JLabel.RIGHT };
        table.getTableHeader().getColumnModel().getColumn(0)
        .setHeaderRenderer(new HeaderRenderer(table, alignments[0]));
        table.getTableHeader().getColumnModel().getColumn(2)
        .setHeaderRenderer(new HeaderRenderer(table, alignments[1]));

        table.getTableHeader().setFont(new Font("Times New Roman", Font.BOLD, 28));
        table.setFont(new Font("Times New Roman", Font.PLAIN, 20));
        table.getColumnModel().getColumn(0).setMinWidth(350);
        table.getColumnModel().getColumn(0).setMaxWidth(350);
        table.getColumnModel().getColumn(2).setMinWidth(135);
        table.getColumnModel().getColumn(2).setMaxWidth(135);
        table.getColumnModel().getColumn(3).setMinWidth(125);
        table.getColumnModel().getColumn(3).setMaxWidth(125);
        table.getColumnModel().getColumn(4).setMinWidth(155);
        table.getColumnModel().getColumn(4).setMaxWidth(155);
        table.setRowHeight(30);

        DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
        rightRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        table.getColumn("Quantity").setCellRenderer( rightRenderer );       
        table.getColumn("Price").setCellRenderer( rightRenderer );      
        table.getColumn("Item Total").setCellRenderer( rightRenderer );     

        table.setShowGrid(true);
        Color color = Color.black;
        MatteBorder border = new MatteBorder(1, 1, 0, 0, color);
        table.setBorder(border);
        table.setGridColor(color);
        table.setFillsViewportHeight(true);

        layoutConstraints.gridx = 0;
        layoutConstraints.gridy = 3;
        layoutConstraints.gridwidth = 3;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 1.0;
        layout.setConstraints(table, layoutConstraints);

        layoutConstraints.gridx = 0;
        layoutConstraints.gridy = 2;
        layoutConstraints.gridwidth = 4;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 0;
        layoutConstraints.weighty = 0;
        layout.setConstraints(table.getTableHeader(), layoutConstraints);


        JScrollPane pane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        layoutConstraints.gridx = 0;
        layoutConstraints.gridy = 3;
        layoutConstraints.gridwidth = 3;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 1.0;
        layout.setConstraints(pane, layoutConstraints);


        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        add(table);     
        add(table.getTableHeader());
        add(pane);    
    }

    public void tableReset() {

        table.setModel(new MyTableModel());

        int[] alignments = new int[] { JLabel.LEFT, JLabel.CENTER, JLabel.RIGHT };
        table.getTableHeader().getColumnModel().getColumn(0)
        .setHeaderRenderer(new HeaderRenderer(table, alignments[0]));

        table.getTableHeader().getColumnModel().getColumn(2)
        .setHeaderRenderer(new HeaderRenderer(table, alignments[1]));

        table.getTableHeader().setFont(new Font("Times New Roman", Font.BOLD, 28));
        table.setFont(new Font("Times New Roman", Font.PLAIN, 20));
        table.getColumnModel().getColumn(0).setMinWidth(350);
        table.getColumnModel().getColumn(0).setMaxWidth(350);
        table.getColumnModel().getColumn(2).setMinWidth(135);
        table.getColumnModel().getColumn(2).setMaxWidth(135);
        table.getColumnModel().getColumn(3).setMinWidth(125);
        table.getColumnModel().getColumn(3).setMaxWidth(125);
        table.getColumnModel().getColumn(4).setMinWidth(155);
        table.getColumnModel().getColumn(4).setMaxWidth(155);
        table.setRowHeight(30);

        DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
        rightRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        table.getColumn("Quantity").setCellRenderer( rightRenderer );       
        table.getColumn("Price").setCellRenderer( rightRenderer );      
        table.getColumn("Item Total").setCellRenderer( rightRenderer );     
    }

    private static class HeaderRenderer implements TableCellRenderer {
        DefaultTableCellRenderer renderer;
        int horAlignment;
        public HeaderRenderer(JTable table, int horizontalAlignment) {
            horAlignment = horizontalAlignment;
            renderer = (DefaultTableCellRenderer)table.getTableHeader()
                    .getDefaultRenderer();
        }
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int col) {
            Component c = renderer.getTableCellRendererComponent(table, value,
                    isSelected, hasFocus, row, col);
            JLabel label = (JLabel)c;
            label.setHorizontalAlignment(horAlignment);
            return label;
        }
    }
}

[Pembaruan] Seperti yang diminta kode yang disarankan dari pertanyaan lain

Scrollbar vertikal di ayunan jTable tidak muncul

Scrollbar horizontal tidak berfungsi dengan JTable di Java Swing

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import java.io.*;

public class TableCreate extends JFrame
{
    JPanel mainPanel;
    TableCreate() throws IOException
    {

        mainPanel=new JPanel(new BorderLayout());
        String InputFile1 = "TableCreate.java";
        BufferedReader breader1 = new BufferedReader(new FileReader(InputFile1));
        String line1 = "";
        line1 = breader1.readLine();

        DefaultTableModel model1 = new DefaultTableModel();
        model1.addColumn("line");

        while((line1=breader1.readLine()) != null)
         {
             System.out.println(line1);
             model1.addRow(new Object[]{line1});
         }
         breader1.close();

        JTable tab=new JTable(model1);

        tab.setPreferredScrollableViewportSize(new Dimension(300, 200));
        tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        TableColumnAdjuster tca = new TableColumnAdjuster(tab);
        tca.adjustColumns();

        JScrollPane js = new JScrollPane(tab);
        add(js);
    }

    public static void main(String[] args) throws IOException
    {
        TableCreate tc=new TableCreate();
        tc.pack();
        tc.setVisible(true);
        tc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

person Noin    schedule 01.07.2015    source sumber
comment
..telah mencoba saran pada pertanyaan stackoverflow lain seperti ini. Pertanyaan mana lagi, daftar (tautan ke) 3 teratas. Mengapa 3 pertanyaan tersebut tidak membantu memperbaiki masalah ini? Untuk bantuan yang lebih baik dan lebih cepat, posting MCVE (Contoh Minimal yang Dapat Diverifikasi Lengkap) atau SSCCE (Contoh Singkat, Mandiri, dan Benar).   -  person Andrew Thompson    schedule 01.07.2015
comment
new Font("Times New Roman", ..) sebaiknya new Font(Font.SERIF, ..) untuk pemeriksaan waktu kompilasi dan ketahanan lintas platform.   -  person Andrew Thompson    schedule 01.07.2015
comment
Sebenarnya apa masalahmu? Karena kode Anda belum lengkap dan tidak bisa dijalankan.   -  person STaefi    schedule 01.07.2015
comment
Saya dapat melihat JTable saya tetapi tidak ada JScrollPane, saya telah memperbarui kodenya, itu hanya JPanel yang saya tambahkan ke JFrame   -  person Noin    schedule 01.07.2015
comment
@Noin silakan lihat jawaban saya.   -  person STaefi    schedule 01.07.2015


Jawaban (1)


Beberapa masalah yang jelas ada pada kode Anda. Yang terbesar adalah:

Di baris terakhir, Anda menambahkan tabel Anda secara eksplisit ke wadah yang mendasarinya. Anda harus mengubah baris berikut di kelas PosPanel Anda:

add(table);                  // remove this line
add(table.getTableHeader()); // remove this line
add(pane); // keep this line 

Biasanya JTable harus ditambahkan ke port tampilan JScrollPane untuk menampilkan headernya. Jika Anda menambahkan JTable secara terpisah ke wadah, headernya tidak akan terlihat.

Kemudian JScrollPane harus ditambahkan ke wadah. Jangan tambahkan JTable itu lagi ke wadah. Ini akan berhasil. Jika ini tidak membantu, kirimkan kode Anda di sini untuk debugging.

Semoga beruntung.

person STaefi    schedule 01.07.2015
comment
Terima kasih itu berhasil, tetapi harus menghapus setConstraints untuk tabel, table.getTableHeader() dan panel. Bagaimana cara mengatur setConstraints tanpa kehilangan JScrollPane. Itu juga menghilangkan lebar kolom khusus saya - person Noin; 01.07.2015
comment
Anda harus menambahkan batasan yang terkait dengan tata letak gridbag ke JScrollPane, bukan JTable. Karena scrollpane sedang ditambahkan ke panel dan berisi JTable di dalam port tampilannya. Saya juga ingat untuk bekerja dengan header tabel dan berperilaku seperti yang saya harapkan. Saya tidak dapat men-debug kode Anda yang tidak lengkap untuk menyelesaikan masalah ukuran kolom Anda. - person STaefi; 01.07.2015