繁体   English   中英

如何使Java Eclipse Jtable单元格/列作为可滚动TextField工作

[英]How to make Java Eclipse Jtable Cell / Column work as scrollable TextField

对于Java Kepler Eclipse和JTable,我试图使列作为JTextArea,JTextPane或类似的东西工作。 我需要文本从单元格的顶部开始,如果文本不适合该单元格,则当它到达带有滚动条的单元格边框时,请更改行。 所有单元格都将被填充,我不仅需要单击它们,还需要它们以这种方式工作,除了滚动条可以在单击单元格时出现,但是当它在单击单元格时出现还是从菜单中出现时并不重要。开始于所有单元,无论哪个更容易。

我的项目实际上是非常不同的,但是我用表编写了这个迷你模型,因此您可以复制,粘贴和运行它以查看问题所在。

我要在代码中添加什么或如何对其进行更改才能做到这一点?

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

public class JavaTestOne {
    JFrame frmApp;
    private JTable table;
    DefaultTableModel model;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JavaTestOne window = new JavaTestOne();
                    window.frmApp.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });  
    }
    public JavaTestOne() {  
        initialize();
    }
    private void initialize() {
        frmApp = new JFrame();
        frmApp.getContentPane().setFont(new Font("Tahoma", Font.PLAIN, 13));
        frmApp.setBounds(300, 100, 500, 300);
        frmApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmApp.getContentPane().setLayout(new CardLayout(0, 0));
        frmApp.setTitle("App");
        {
            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setBounds(50, 50, 100, 100);
            frmApp.add(scrollPane);
            {
                table = new JTable();
                table.setFillsViewportHeight(true);
                Object[][] data = {
                        {"Monday", ""},
                        {"Tuesday", ""},
                        {"Wednesday", ""}};
                String[] cols = {"DAY","PROGRAM"};
                model = new DefaultTableModel(data, cols) {

                    public boolean isCellEditable(int row, int col) {
                        return false;
                    }

                    public Class getColumnClass(int column) {
                        return getValueAt(0, column).getClass();
                    }

                };

                table.setModel(model);
                table.setRowHeight(100);
                table.getColumn("PROGRAM").setCellRenderer(new TextAreaCellRenderer());
                scrollPane.setViewportView(table);
                }
            model.setValueAt("very large text from database (with resultset (I dont know it that makes a differance) ----------more text-------------- ------- more text------------ -----------more text--------- -------more text-------- -------more text----------- -------more text-------- ---------more text--------", 0, 1);
            model.setValueAt("very large text from database (with resultset) ----------more text-------------- ------- more text------------ -----------more text--------- -------more text-------- -------more text----------- -------more text-------- ---------more text--------", 1, 1);
        }
    }

    public class TextAreaCellRenderer extends AbstractCellEditor implements
          TableCellRenderer {
          private JTextPane textPane;
          private JScrollPane scroll;

          public TextAreaCellRenderer() {
              textPane = new JTextPane();
            scroll = new JScrollPane(textPane);
          }
          public JTextPane getTextArea(){
                return textPane;
          }

          public Object getCellEditorValue() {
            return textPane.getText();
          }

          public Component getTableCellRendererComponent(JTable table,
           Object value, boolean isSelected, boolean hasFocus, int row, int column){
              textPane.setText((value != null) ? value.toString() : "");
            return scroll;
          }
    }
}

当嵌入下一个代码时,它仅在单击单元格并且所有单元格都可编辑时才起作用。 我需要单元格不可编辑,此表只是为了使用户可以查看他之前输入的数据,而不能键入或更改它。

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

public class JavaTestOne {
    JFrame frmApp;
    private JTable table;
    DefaultTableModel model;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JavaTestOne window = new JavaTestOne();
                    window.frmApp.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });  
    }
    public JavaTestOne() {  
        initialize();
    }
    private void initialize() {
        frmApp = new JFrame();
        frmApp.getContentPane().setFont(new Font("Tahoma", Font.PLAIN, 13));
        frmApp.setBounds(300, 100, 500, 300);
        frmApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmApp.getContentPane().setLayout(new CardLayout(0, 0));
        frmApp.setTitle("App");
        {
            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setBounds(50, 50, 100, 100);
            frmApp.add(scrollPane);
            {
                table = new JTable();
                table.setFillsViewportHeight(true);
                Object[][] data = {
                        {"Monday", ""},
                        {"Tuesday", ""},
                        {"Wednesday", ""}};
                String[] cols = {"DAY","PROGRAM"};
                model = new DefaultTableModel(data, cols) {

                    boolean[] canEdit = new boolean[]{
                            false, true
                    };
                    public boolean isCellEditable(int row, int col) {
                        return canEdit[col];
                    }

                    public Class getColumnClass(int column) {
                        return getValueAt(0, column).getClass();
                    }

                };

                table.setModel(model);
                table.setRowHeight(100);
                table.getColumn("PROGRAM").setCellEditor(new TextAreaCellRenderer());
                scrollPane.setViewportView(table);
                }
            model.setValueAt("very large text from database (with resultset (I dont know it that makes a differance) ----------more text-------------- ------- more text------------ -----------more text--------- -------more text-------- -------more text----------- -------more text-------- ---------more text--------", 0, 1);
            model.setValueAt("very large text from database (with resultset) ----------more text-------------- ------- more text------------ -----------more text--------- -------more text-------- -------more text----------- -------more text-------- ---------more text--------", 1, 1);
        }
    }

    public class TextAreaCellRenderer extends AbstractCellEditor implements
    TableCellEditor{
          private JTextPane textPane;
          private JScrollPane scroll;

          public TextAreaCellRenderer() {
              textPane = new JTextPane();
            scroll = new JScrollPane(textPane);
          }
          public JTextPane getTextArea(){
                return textPane;
          }

          public Object getCellEditorValue() {
            return textPane.getText();
          }


        public Component getTableCellEditorComponent(JTable table,
                Object value, boolean isSelected, int row, int column) {
            textPane.setText((value != null) ? value.toString() : "");
            return scroll;
        }

    }
}

只需右键单击“设计”部分中的“ Jtable”,然后按环绕,然后按javax.swing.JScrollPane

共享知识...如何使单元格与单独的scrollPane一起用作JTextPane,以及如果需要的话如何使其不可编辑。 它对于想要复制和运行代码的任何人都是可运行的。 如果您没有Eclipse Kepler,则可能需要添加一些Overrides

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

public class JavaTestOne {
    JFrame frmApp;
    private JTable table;
    DefaultTableModel model;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JavaTestOne window = new JavaTestOne();
                    window.frmApp.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });  
    }
    public JavaTestOne() {  
        initialize();
    }
    private void initialize() {
        frmApp = new JFrame();
        frmApp.getContentPane().setFont(new Font("Tahoma", Font.PLAIN, 13));
        frmApp.setBounds(300, 100, 500, 300);
        frmApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmApp.getContentPane().setLayout(new CardLayout(0, 0));
        frmApp.setTitle("App");
        {
            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setBounds(50, 50, 100, 100);
            frmApp.add(scrollPane);
            {
                table = new JTable();
                table.setFillsViewportHeight(true);
                Object[][] data = {
                        {"Monday", ""},
                        {"Tuesday", ""},
                        {"Wednesday", ""}};
                String[] cols = {"DAY","PROGRAM"};
                model = new DefaultTableModel(data, cols) {

                    public boolean isCellEditable(int row, int col) {
                        return true;
                    }

                    public Class getColumnClass(int column) {
                        return getValueAt(0, column).getClass();
                    }

                };

                table.setModel(model);
                    table.setRowHeight(100);
//add getCellEditor for the individual cell, and setCellRenderer for the column
                    table.getColumn("PROGRAM").setCellEditor(new TextAreaCellRenderer());
                    table.getColumn("PROGRAM").setCellRenderer(new TextAreaCellRenderer());
                    scrollPane.setViewportView(table);
                    }
                model.setValueAt("very large text from database ------- more text------------ ------- more text------------ ----------more text-------------- ------- more text------------ -----------more text--------- -------more text-------- -------more text----------- -------more text-------- ---------more text--------", 0, 1);
                model.setValueAt("very large text from database (with resultset) ----------more text-------------- ------- more text------------ -----------more text--------- -------more text-------- -------more text----------- -------more text-------- ---------more text--------", 1, 1);
            }
        }

        public class TextAreaCellRenderer extends AbstractCellEditor implements
              TableCellRenderer,TableCellEditor {
              private JTextPane textPane;
              private JScrollPane scroll;

              public TextAreaCellRenderer() {
                  textPane = new JTextPane();
                scroll = new JScrollPane(textPane);
              }
              public JTextPane getTextArea(){
                    return textPane;
              }

              public Object getCellEditorValue() {
                return textPane.getText();
              }
    //this is what makes it work for the for the column


         public Component getTableCellRendererComponent(JTable table,
                   Object value, boolean isSelected, boolean hasFocus, int row, int column){
                      textPane.setText((value != null) ? value.toString() : "");
                    return scroll;
                  }

    //this is what makes it work for the cell
                public Component getTableCellEditorComponent(JTable table, 
                        Object value, boolean isSelected, int row, int column) {
                    textPane.setText((value != null) ? value.toString() : "");
                    textPane.setEditable(false); //this is what makes it uneditable
                    return scroll;
                }
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM