Java 如何调整JScrollPane行标题的大小

Java 如何调整JScrollPane行标题的大小,java,jtable,Java,Jtable,下面的代码将生成此表: 如图所示,在此表中,您可以调整列A、B、。。。 但不能用小写字母a、b、c、e调整列的大小。。。i、 例如,JScrollPane的行标题 你知道我该怎么做吗 package main; // Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html /* (swing1.1beta3) */ import java.awt.BorderLayout;

下面的代码将生成此表:

如图所示,在此表中,您可以调整列A、B、。。。 但不能用小写字母a、b、c、e调整列的大小。。。i、 例如,JScrollPane的行标题

你知道我该怎么做吗

package main;
// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html
/* (swing1.1beta3) */
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.AbstractListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

/**
 * @version 1.0 11/09/98
 */

class RowHeaderRenderer extends JLabel implements ListCellRenderer {

  RowHeaderRenderer(JTable table) {
    JTableHeader header = table.getTableHeader();
    setOpaque(true);
    setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    setHorizontalAlignment(CENTER);
    setForeground(header.getForeground());
    setBackground(header.getBackground());
    setFont(header.getFont());
  }

  public Component getListCellRendererComponent(JList list, Object value,
      int index, boolean isSelected, boolean cellHasFocus) {
    setText((value == null) ? "" : value.toString());
    return this;
  }
}

public class RowHeaderTable extends JFrame {

  public RowHeaderTable() {
    super("Row Header Example");
    setSize(300, 150);

    ListModel lm = new AbstractListModel() {
      String headers[] = { "a", "b", "c", "d", "e", "f", "g", "h", "i" };

      public int getSize() {
        return headers.length;
      }

      public Object getElementAt(int index) {
        return headers[index];
      }
    };

    DefaultTableModel dm = new DefaultTableModel(lm.getSize(), 10);
    JTable table = new JTable(dm);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    JList rowHeader = new JList(lm);
    rowHeader.setFixedCellWidth(50);

    rowHeader.setFixedCellHeight(table.getRowHeight()
        + table.getRowMargin());
    //                           + table.getIntercellSpacing().height);
    rowHeader.setCellRenderer(new RowHeaderRenderer(table));

    JScrollPane scroll = new JScrollPane(table);
    scroll.setRowHeaderView(rowHeader);
    getContentPane().add(scroll, BorderLayout.CENTER);
  }

  public static void main(String[] args) {
      RowHeaderTable frame = new RowHeaderTable();
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    frame.setVisible(true);
  }
}

正如@MadProgrammer已经建议的,MouseMotionListener可能是唯一的方法,如果不是最简单的方法的话。下面是您修改的代码:

package main;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.AbstractListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

class RowHeaderRenderer extends JLabel implements ListCellRenderer {

  RowHeaderRenderer(JTable table) {
    JTableHeader header = table.getTableHeader();
    setOpaque(true);
    setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    setHorizontalAlignment(CENTER);
    setForeground(header.getForeground());
    setBackground(header.getBackground());
    setFont(header.getFont());
  }

  @Override
  public Component getListCellRendererComponent(JList list, Object value,
      int index, boolean isSelected, boolean cellHasFocus) {
    setText((value == null) ? "" : value.toString());
    return this;
  }
}

public class RowHeaderTable extends JFrame {

  public RowHeaderTable() {
    super("Row Header Example");
    setSize(300, 150);

    ListModel lm = new AbstractListModel() {
      String headers[] = { "a", "b", "c", "d", "e", "f", "g", "h", "i" };

      @Override
      public int getSize() {
        return headers.length;
      }

      @Override
      public Object getElementAt(int index) {
        return headers[index];
      }
    };    

    DefaultTableModel dm = new DefaultTableModel(lm.getSize(), 15);
    JTable table = new JTable(dm);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    JList rowHeader = new JList(lm);
    rowHeader.setFixedCellWidth(50);

    // ***************  CODE ADDED  *******************
    // Add a Mouse Motion Listener for the rowHeader JList.
    rowHeader.addMouseMotionListener(new MouseMotionListener() {
        @Override
        public void mouseDragged(MouseEvent e) {
            // Set the list cell width as mouse is dragged.
            rowHeader.setFixedCellWidth(e.getX());
      }

        @Override
        public void mouseMoved(MouseEvent e) {
            // If the mouse pointer is near the end region of the 
            // list cell then change the mouse cursor to a resize cursor.
            if ((e.getX()>= (rowHeader.getWidth() - 5)) && (e.getX()<= rowHeader.getWidth())) {
                rowHeader.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
            } 
            // If the mouse pointer is not near the end region of a cell 
            // then change the pointer back to its default.
            else {
                rowHeader.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }
        }
    });
    // ***********************************************  

    rowHeader.setFixedCellHeight(table.getRowHeight()
        + table.getRowMargin());
    //  + table.getIntercellSpacing().height);
    rowHeader.setCellRenderer(new RowHeaderRenderer(table));

    JScrollPane scroll = new JScrollPane(table);
    scroll.setRowHeaderView(rowHeader);
    getContentPane().add(scroll, BorderLayout.CENTER);
  }

  public static void main(String[] args) {
      RowHeaderTable frame = new RowHeaderTable();
    frame.addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    frame.setVisible(true);
  }
}
packagemain;
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.Cursor;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseMotionListener;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入javax.swing.AbstractListModel;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.ListCellRenderer;
导入javax.swing.ListModel;
导入javax.swing.UIManager;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.JTableHeader;
类RowHeaderRenderer扩展了JLabel实现ListCellRenderer{
RowHeaderRenderer(JTable表格){
JTableHeader=table.getTableHeader();
set不透明(true);
setboorder(UIManager.getBorder(“TableHeader.cellBorder”);
设置水平对齐(中心);
set前台(header.get前台());
setBackground(header.getBackground());
setFont(header.getFont());
}
@凌驾
公共组件GetListCellRenderComponent(JList列表、对象值、,
整型索引,布尔型isSelected,布尔型cellHasFocus){
setText((value==null)?“”:value.toString());
归还这个;
}
}
公共类RowHeaderTable扩展JFrame{
公共RowHeaderTable(){
超级(“行标题示例”);
设置大小(300150);
ListModel lm=新抽象ListModel(){
字符串头[]={“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”、“i”};
@凌驾
公共int getSize(){
返回页眉长度;
}
@凌驾
公共对象getElementAt(int索引){
返回标题[索引];
}
};    
DefaultTableModel dm=新的DefaultTableModel(lm.getSize(),15);
JTable table=新的JTable(dm);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JList行标题=新JList(lm);
rowHeader.setFixedCellWidth(50);
//*************已添加代码*******************
//为行标题列表添加鼠标运动侦听器。
rowHeader.addMouseMotionListener(新的MouseMotionListener(){
@凌驾
公共无效鼠标标记(鼠标事件e){
//设置拖动鼠标时的列表单元格宽度。
setFixedCellWidth(e.getX());
}
@凌驾
public void mouseMoved(MouseEvent e){
//如果鼠标指针靠近
//列表单元格,然后将鼠标光标更改为调整大小光标。

如果((e.getX()>=(rowHeader.getWidth()-5))&&(e.getX())行标题的控制方式不同于
JTable
,您至少需要我们提供一个
mousemotionlistener
,并可能更改组件/标题的首选大小。我认为可能是这样。不过,我对实现侦听器知之甚少。这方面的参考已经很受欢迎。D和听众交流比看起来容易多了!谢谢!