2015-12-11 22 views
0

代码波纹管会生成此表: enter image description here如何调整JScrollPane中的rowHeader

由于图像表明,在这个表中可以调整列A,B,... 但你不能用调整列小写字母a,b,c,e ...即JScrollPane的rowHeader。

任何想法我该怎么做?

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); 
    } 
} 
+0

行标题的控制方式与'JTable'不同,你至少需要一个'MouseMoitionListener',并且可以改变组件/标题 – MadProgrammer

+0

是的,我认为可能是这样。虽然我对执行听众知之甚少。 这方面的参考已受欢迎。 – pedroabreu

回答

2

正如@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); 
    } 
} 
+0

处理听众比看起来容易!谢谢! – pedroabreu