Java 斯坦纳(){ @凌驾 已执行的公共无效行动(行动事件ae){ int i,j; 布尔行; 所选字符串=空; JLabel lbl=新的JLabel(); 对于(i=0;i

Java 斯坦纳(){ @凌驾 已执行的公共无效行动(行动事件ae){ int i,j; 布尔行; 所选字符串=空; JLabel lbl=新的JLabel(); 对于(i=0;i,java,swing,jframe,Java,Swing,Jframe,斯坦纳(){ @凌驾 已执行的公共无效行动(行动事件ae){ int i,j; 布尔行; 所选字符串=空; JLabel lbl=新的JLabel(); 对于(i=0;i

斯坦纳(){ @凌驾 已执行的公共无效行动(行动事件ae){ int i,j; 布尔行; 所选字符串=空; JLabel lbl=新的JLabel(); 对于(i=0;i/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package testcolumnheadings; import java.awt.*; import java.awt.event.*; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import javax.swing.JOptionPane; import javax.swing.event.*; import javax.swing.table.*; import testcolumnheadings.TestColumnHeadings.Status; import static testcolumnheadings.TestColumnHeadings.table; public class TestColumnHeadings extends JPanel { enum Status {SELECTED, DESELECTED, INDETERMINATE} DefaultTableModel model = null; static JTable table = null; static JTable jbl = null; static JFileChooser fileChooser; static File prtFile = null; static String prtFilePath = null; public TestColumnHeadings(){ super (new BorderLayout()); Object[] columnNames = {Status.INDETERMINATE, "Integer", "String"}; Object[][] data = {{true, 1, "BBB"}, {false, 12, "AAA"}, {true, 2, "DDD"}, {false, 5, "CCC"}, {true, 3, "EEE"}, {false, 6, "GGG"}, {true, 4, "FFF"}, {false, 7, "HHH"}, {true, 1, "III"}, {false, 312, "JJJ"}, {true, 12, "KKK"}, {false, 75, "LLL"}, {true, 2, "DDD"}, {false, 5, "CCC"}, {true, 3, "EEE"}, {false, 6, "GGG"}, {true, 4, "FFF"}, {false, 7, "HHH"}, {true, 1, "III"}, {false, 312, "JJJ"}, {true, 12, "KKK"}, {false, 75, "LLL"}, {true, 2, "DDD"}, {false, 5, "CCC"}, {true, 3, "EEE"}, {false, 6, "GGG"}, {true, 4, "FFF"}, {false, 7, "HHH"}, {true, 1, "III"}, {false, 312, "JJJ"}, {true, 12, "KKK"}, {false, 75, "LLL"}, {true, 13, "MMM"}, {false, 46, "NNN"}, {true, 14, "OOO"}, {true, 67, "PPP"}, {true, 11, "QQQ"}, {false, 112, "RRR"}, {true, 22, "SSS"}, {false, 35, "TTT"}, {true, 23, "UUU"}, {false, 56, "VVV"}, {true, 24, "WWW"}, {true, 97, "XXX"}}; model = new DefaultTableModel(data, columnNames){ @Override public Class<?> getColumnClass(int column){ return getValueAt(0, column).getClass(); } }; table = new JTable(model){ @Override public void updateUI(){ super.updateUI(); TableCellRenderer r = getDefaultRenderer(Boolean.class); if(r instanceof JComponent){ ((JComponent)r).updateUI(); } } @Override public Component prepareEditor (TableCellEditor editor, int row, int column){ Component c = super.prepareEditor(editor, row, column); if (c instanceof JCheckBox){ JCheckBox b = (JCheckBox)c; b.setBackground(getSelectionBackground()); b.setBorderPainted(true); } return c; } }; int modelColumnIndex = 0; TableCellRenderer renderer = new HeaderRenderer (table.getTableHeader(), modelColumnIndex); table.getColumnModel().getColumn(modelColumnIndex).setHeaderRenderer(renderer); model.addTableModelListener(new HeaderCheckBoxHandler(table, modelColumnIndex)); add(new JScrollPane(table)); setPreferredSize (new Dimension(320, 240)); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run(){ createAndShowGUI(); } }); } public static void createAndShowGUI() { try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e){ e.printStackTrace(); } JFrame frame = new JFrame ("Table Header Check Box"); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); TestColumnHeadings tstHead = new TestColumnHeadings(); JPanel p1 = new JPanel(); p1.setLayout(new BorderLayout()); p1.add(tstHead); jbl = new JTable(table.getRowCount(), 1); jbl.setRowHeight(6); jbl.getColumnModel().getColumn(0).setMaxWidth(6); // jbl.; JPanel p2 = new JPanel(new BorderLayout()); p2.add(jbl, BorderLayout.CENTER); JButton btn = new JButton("Save Selection"); btn.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ae) { int i, j; boolean row; String selected = null; JLabel lbl = new JLabel(); for (i = 0; i < table.getRowCount(); i ++){ row = (boolean)table.getValueAt(i, 0); if (row){ if (selected == null){ selected = (String)(i + " " + table.getValueAt(i, 1) + " " + table.getValueAt(i, 2) + "\n"); } else{ selected += (String)(i + " " + table.getValueAt(i, 1) + " " + table.getValueAt(i, 2) + "\n"); } } } fileChooser = new JFileChooser(); fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); j = fileChooser.showSaveDialog(new JFileChooser()); if (j == JFileChooser.APPROVE_OPTION){ prtFile = fileChooser.getSelectedFile(); prtFilePath = prtFile.getAbsolutePath(); System.out.println("Save File Selected: " + prtFilePath); try { try (FileWriter fw = new FileWriter(prtFile)) { fw.write(selected); } JOptionPane.showMessageDialog(new JOptionPane(), "File saved completed."); } catch (IOException ex) { Logger.getLogger(TestColumnHeadings.class.getName()).log(Level.SEVERE, null, ex); } } } }); JPanel p3 = new JPanel(new FlowLayout (FlowLayout.RIGHT)); p3.add(btn, BorderLayout.SOUTH); frame.add(p1, BorderLayout.CENTER); frame.add(p2, BorderLayout.EAST); frame.add(p3, BorderLayout.SOUTH); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public class StatusColumnCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){ JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); l.setBackground(Color.WHITE); l.setForeground(Color.BLACK); if (table.getValueAt(0, row).equals(true)){ l.setForeground(Color.WHITE); l.setBackground(Color.RED); } else { l.setForeground(Color.WHITE); l.setBackground(Color.CYAN); } return l; } } } class HeaderRenderer extends JCheckBox implements TableCellRenderer { private final JLabel label = new JLabel ("Check All"); private int targetColumnIndex; public HeaderRenderer (JTableHeader header, int index){ super ((String)null); this.targetColumnIndex = index; setOpaque(false); setFont(header.getFont()); header.addMouseListener(new MouseAdapter(){ @Override public void mouseClicked (MouseEvent e){ JTableHeader header = (JTableHeader)e.getSource(); JTable table = header.getTable(); TableColumnModel columnModel = table.getColumnModel(); int vci = columnModel.getColumnIndexAtX(e.getX()); int mci = table.convertColumnIndexToModel(vci); if (mci == targetColumnIndex){ TableColumn column = columnModel.getColumn(vci); Object v = column.getHeaderValue(); boolean b = Status.DESELECTED.equals(v); TableModel m = table.getModel(); column.setHeaderValue(b ? Status.SELECTED : Status.DESELECTED); for (int i = 0; i < m.getRowCount(); i++){ table.setValueAt(b, i, 0); } header.repaint(); } } }); } @Override public Component getTableCellRendererComponent (JTable tbl, Object val, boolean isS, boolean hasF, int row, int col){ TableCellRenderer r = tbl.getTableHeader().getDefaultRenderer(); JLabel l = (JLabel)r.getTableCellRendererComponent(tbl, val, isS, hasF, col, col); if (targetColumnIndex == tbl.convertColumnIndexToModel(col)){ if (val instanceof Status){ switch ((Status) val){ case SELECTED: setSelected(true); setEnabled(true); break; case DESELECTED: setSelected(false); setEnabled(true); break; case INDETERMINATE: setSelected(true); setEnabled(false); break; } }else{ setSelected(true); setEnabled(false); } label.setIcon(new ComponentIcon(this)); l.setIcon(new ComponentIcon(label)); l.setText(null); } return l; } @Override public void updateUI(){ setText(null); super.updateUI(); } } class HeaderCheckBoxHandler implements TableModelListener { private final JTable table; private final int targetColumnIndex; public HeaderCheckBoxHandler (JTable table, int index){ this.table = table; this.targetColumnIndex = index; } @Override public void tableChanged (TableModelEvent e){ if (e.getType() == TableModelEvent.UPDATE && e.getColumn() == targetColumnIndex){ int vci = table.convertColumnIndexToView(targetColumnIndex); TableColumn column = table.getColumnModel().getColumn(vci); if (!Status.INDETERMINATE.equals(column.getHeaderValue())){ column.setHeaderValue(Status.INDETERMINATE); } else{ boolean selected = true, deselected = true; TableModel m = table.getModel(); for (int i = 0; i < m.getRowCount(); i ++){ Boolean b = (Boolean)m.getValueAt(i, targetColumnIndex); selected &= b; deselected &= !b; if (selected == deselected) return; } if (selected){ column.setHeaderValue(Status.SELECTED); }else if (deselected){ column.setHeaderValue(Status.DESELECTED); }else{ return; } } JTableHeader h = table.getTableHeader(); h.repaint(h.getHeaderRect(vci)); } } } class ComponentIcon implements Icon { private final JComponent cmp; public ComponentIcon(JComponent cmp){ this.cmp = cmp; } @Override public int getIconWidth(){ return cmp.getPreferredSize().width; } @Override public int getIconHeight(){ return cmp.getPreferredSize().height; } @Override public void paintIcon(Component c, Graphics g, int x, int y){ SwingUtilities.paintComponent(g, cmp, (Container)c, x, y, getIconWidth(), getIconHeight()); } }
public class Form extends JFrame {

    public Form() {
        DefaultTableModel model;
        final JTable t = new JTable(model = new DefaultTableModel(new Object[][]{},new Object[]{1,2,3,4,5}));
        for(int i =0;i<10;i++){
            model.addRow(new Object[]{i,i,i,i,i});
        }
        JScrollPane jsp = new JScrollPane(t);
        final RightPanel right = new RightPanel();
        t.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent arg0) {
                right.col.setText("Col " + t.getSelectedColumn());
                right.row.setText("Row " + t.getSelectedRow());
                if(t.getSelectedColumn() != -1 && t.getSelectedRow() != -1){
                    right.text.setText("Value " + t.getValueAt(t.getSelectedRow(),t.getSelectedColumn()));
                }
            }
        });
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(jsp, BorderLayout.CENTER);
        add(right, BorderLayout.EAST);
        pack();
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new Form().setVisible(true);
            }
        });
    }

    class RightPanel extends JPanel{

        JLabel row;
        JLabel col;
        JLabel text;

        public RightPanel(){
            setLayout(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();
            c.insets = new Insets(5, 5, 5, 5);
            JLabel l = new JLabel("Option Panel");
            c.gridy = 0;
            add(l,c);
            row = new JLabel("2");
            c.gridy++;
            add(row,c);
            col = new JLabel("3");
            c.gridy++;
            add(col,c);
            text = new JLabel("4");
            c.gridy++;
            add(text,c);
        }

    }
}