Swing 问答

  1. 我在哪里可以找到适合于初学者的信息?

   可以参考 Java 指南的 Swing 页面: http://java.sun.com/docs/books/tutorial/uiswing/

  1. 当我进入一个单元格时,它为什么不能获得焦点?

   当单击单元格时,它就获得了焦点;但当移动光标到单元格时,它并不能获得焦点。在J2SE 1.4中新增了一个名为        surrendersFocusOnKeystroke属性来解决这个问题,并且维持向后兼容。

   相关信息可参考: http://java.sun.com/j2se/1.4/docs/guide/swing/SwingChanges.html#JTable

  1. 我怎样设置单元格行、列的颜色?

   每个单元格都使用 DefaultTableCellRenderer 构建, 通过该类的子类你可以作特定的修改。

   下面的代码演示了怎样实现。它有如此多的可扩充性,以致于 MyCellRenderer 可以包括设置行、列、边框以及文本设置等信息。

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

   class TableTest extends JFrame {

     TableTest() {

     final MyCellRenderer mcr = new MyCellRenderer();

     JTable myTable = new JTable(new MyTableModel()) {
      public TableCellRenderer getCellRenderer(int row, int column) {
         return mcr;
       }
     };

      getContentPane().add(new JScrollPane(myTable));
      setSize(640, 480);
      show();
     }

     public static void main(String args[]) {

      new TableTest();
     }
   }

   class MyTableModel extends AbstractTableModel {

     String[] columnNames = {"Name", "Age", "Sex"};
     String[][] columnData = { {"Bob", "23" , "M"}, {"Claire", "99", "F"}, {"Spot", "7", "F"}, {"Phil", "69", "M"}, };

     public Object getValueAt(int row, int col) {return columnData[row][col];}
     public String getColumnName(int col) { return columnNames[col];}
     public int getColumnCount() { return columnNames.length;}
     public int getRowCount() { return columnData.length; }
    }

    class MyCellRenderer extends DefaultTableCellRenderer {

     public Component getTableCellRendererComponent
 (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

      // 获取默认的设置
      Component cell = super.getTableCellRendererComponent ( table, value,isSelected, hasFocus, row, column);

      if (row % 2 == 0) cell.setBackground(Color.blue);
      else cell.setBackground(Color.gray);

      if (column % 2 == 0) cell.setBackground(Color.green);

      return cell;
     }
   }

  1. 在表中我怎样创建一行表头列?

      请查看文件:[ RowHeaderExample.java]

   该解决方案用来创建一个位于JScrollPane行头的组件。该组件将JList添加到行头。

   JList 有:
   - ListModel; 定义列表数据
 
   - RowHeaderRenderer; 定义每个单元格的感观

  1. 我应该选择哪种表格模式?

   表格模型层次提供了:
 
   javax.swing.table.TableModel (接口)
    javax.swing.table.AbstractTableModel (实现TableModel的类)
    javax.swing.table.DefaultTableModel (继承自AbstractTableModel的类)

   javax.swing.table.TableModel

   该接口提供了: Listener 注册, 单元值存取, 列命名, 列存取及创建表模型基础等功能。

   使用实现 TableModel 接口的主要优势是方法的定义可以被定制以及内部数据描述可被扩充 ,实现可变的应用。

   javax.swing.table.AbstractTableModel

   AbstractTableModel 是一种使用表格形数据的简单方法,只需简单的通过重载三个方法 getValueAt, getColumnCount getRowCount 即可。

   AbstractTable 模型也提供了事件处理,如 fireTableDataChanged, fireRowsUpdated 等等...

   AbstractTableModel 构建于 TableModel 之上, 其数据的内部描述可以是静态的(可节省存储空间) 或动态的,这取决于具体的应用。

   通过使用缓冲机制 getValueAt 方法取得具体的内容, 可以使显示和滚动方面的性能得到极大的提高。

   javax.swing.table.DefaultTableModel

   如果在JTable的构造函数中不指定参数,它将使默认的表格模式。

   DefaultTableModels 内部数据描述是向量体系。如果数据不是表格形式,这倒是个很好的方法。

   虽然设置了数据,但执行如滚动、显示应该和数据缓冲时一样。如果数据量大或已经缓冲(比如数据库),那么已缓冲数据的复制品可能是个不合适的选择。

   使用 DefaultTableModel 的一个建议是注意它的易变性。setValueAt 的实现和对其 / 修改包括了插入、添加、删除,以及表格构建后所有易变的数据。

   其它建议是要有一个好的设计。

  1. 怎样禁止用户移动表头或重置列大小?

   要限制列动作,使用 table.getTableHeader().setReorderingAllowed(false);

   要限制列重置大小,使用 table.getTableHeader().setResizingAllowed(false);

   要限制个别列重置大小 table.getColumnModel().getColumn(index).setResizable(false/true);

    注意:这些并不适用于J2SE 1.3 以前的版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现一个在线问答GUI,你可以考虑使用Java Swing框架。下面是一个简单的Java Swing实现在线问答GUI的示例代码: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class OnlineQA extends JFrame implements ActionListener { private JTextField questionField; private JTextArea answerArea; public OnlineQA() { // 设置窗口标题 setTitle("在线问答"); // 设置窗口大小 setSize(500, 400); // 设置窗口位置 setLocationRelativeTo(null); // 设置窗口关闭时退出程序 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建问题输入框和回答显示框 questionField = new JTextField(20); answerArea = new JTextArea(15, 40); answerArea.setEditable(false); // 创建按钮 JButton askButton = new JButton("提问"); askButton.addActionListener(this); // 创建面板 JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(new JLabel("请输入您的问题:"), BorderLayout.WEST); panel.add(questionField, BorderLayout.CENTER); panel.add(askButton, BorderLayout.EAST); // 将面板和回答显示框添加到窗口中 Container contentPane = getContentPane(); contentPane.add(panel, BorderLayout.NORTH); contentPane.add(new JScrollPane(answerArea), BorderLayout.CENTER); } @Override public void actionPerformed(ActionEvent e) { String question = questionField.getText(); String answer = getAnswer(question); answerArea.append("问:" + question + "\n"); answerArea.append("答:" + answer + "\n\n"); questionField.setText(""); } private String getAnswer(String question) { // 在这里编写获取答案的代码 // 可以调用其他API或服务来获取答案 // 这里只是一个示例,直接返回问题的倒序字符串 return new StringBuilder(question).reverse().toString(); } public static void main(String[] args) { OnlineQA onlineQA = new OnlineQA(); onlineQA.setVisible(true); } } ``` 在这个示例中,我们创建了一个OnlineQA类,继承自JFrame类,实现了ActionListener接口。在构造方法中,我们设置了窗口的标题、大小、位置和关闭操作;创建了问题输入框、回答显示框和按钮,将它们添加到面板中,并将面板和回答显示框添加到窗口中。在actionPerformed方法中,我们获取用户输入的问题,调用getAnswer方法获取答案,将问题和答案显示在回答显示框中,并清空问题输入框。getAnswer方法中只是一个简单的示例,将问题的倒序字符串作为答案返回,实际情况需要根据实际需求调用其他API或服务来获取答案。最后,在main方法中创建OnlineQA对象并显示窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值