Java JTable行可选择,但单元格不可选择
默认情况下,JTable是可编辑的,当我们选择任何一行时,就会得到这种GUIJava JTable行可选择,但单元格不可选择,java,swing,jtable,row,Java,Swing,Jtable,Row,默认情况下,JTable是可编辑的,当我们选择任何一行时,就会得到这种GUI 这里我们有两个边框,一个围绕整行,另一个围绕选择行的特定单元格。我需要外部边框(围绕整行),但不需要内部边框(每个单元格)。有没有办法做到这一点。我想,您需要定制一个边框 import java.awt.*; import java.util.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*; publi
这里我们有两个边框,一个围绕整行,另一个围绕选择行的特定单元格。我需要外部边框(围绕整行),但不需要内部边框(每个单元格)。有没有办法做到这一点。我想,您需要定制一个
边框
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class AroundEntireRowFocusTest {
String[] columnNames = {"A", "B", "C"};
Object[][] data = {
{"aaa", 12, "ddd"}, {"bbb", 5, "eee"}, {"CCC", 92, "fff"}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
@Override public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
public JComponent makeUI() {
UIManager.put("Table.focusCellHighlightBorder", new DotBorder(2, 2, 2, 2));
JTable table = new JTable(model) {
private final DotBorder dotBorder = new DotBorder(2, 2, 2, 2);
void updateBorderType(DotBorder border, boolean isLeadRow, int column) {
border.type = EnumSet.noneOf(DotBorder.Type.class);
if (isLeadRow) {
border.type.add(DotBorder.Type.LEAD);
if (column == 0) {
border.type.add(DotBorder.Type.WEST);
}
if (column == getColumnCount() - 1) {
border.type.add(DotBorder.Type.EAST);
}
}
}
@Override public Component prepareRenderer(
TableCellRenderer tcr, int row, int column) {
JComponent c = (JComponent) super.prepareRenderer(tcr, row, column);
c.setBorder(dotBorder);
updateBorderType(
dotBorder, row == getSelectionModel().getLeadSelectionIndex(), column);
return c;
}
};
table.setShowGrid(false);
table.setIntercellSpacing(new Dimension());
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(table));
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new AroundEntireRowFocusTest().makeUI());
frame.setSize(320, 240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class DotBorder extends EmptyBorder {
public enum Type { LEAD, WEST, EAST; }
public EnumSet<Type> type = EnumSet.noneOf(Type.class);
private static final BasicStroke dashed = new BasicStroke(
1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER,
10f, (new float[] {1f}), 0f);
private static final Color DOT_COLOR = new Color(200, 150, 150);
public DotBorder(int top, int left, int bottom, int right) {
super(top, left, bottom, right);
}
@Override public boolean isBorderOpaque() {
return true;
}
@Override public void paintBorder(
Component c, Graphics g, int x, int y, int w, int h) {
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(x, y);
g2.setPaint(DOT_COLOR);
g2.setStroke(dashed);
if (type.contains(Type.WEST)) {
g2.drawLine(0, 0, 0, h);
}
if (type.contains(Type.EAST)) {
g2.drawLine(w - 1, 0, w - 1, h);
}
if (type.contains(Type.LEAD)) {
if (c.getBounds().x % 2 == 0) {
g2.drawLine(0, 0, w, 0);
g2.drawLine(0, h - 1, w, h - 1);
} else {
g2.drawLine(1, 0, w, 0);
g2.drawLine(1, h - 1, w, h - 1);
}
}
g2.dispose();
}
}
import java.awt.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.table.*;
公共类AroundireRowFocusTest{
字符串[]columnNames={“A”、“B”、“C”};
对象[][]数据={
{“aaa”,12,“ddd”},{“bbb”,5,“eee”},{“CCC”,92,“fff”}
};
DefaultTableModel=新的DefaultTableModel(数据、列名){
@重写公共类getColumnClass(int列){
返回getValueAt(0,列).getClass();
}
};
公共JComponent makeUI(){
UIManager.put(“Table.focusCellHighlightBorder”,新的点边界(2,2,2,2));
JTable表格=新JTable(型号){
私有最终点边界点边界=新点边界(2,2,2,2);
void updateOrderType(点边框、布尔isLeadRow、int列){
border.type=EnumSet.noneOf(DotBorder.type.class);
如果(isLeadRow){
border.type.add(DotBorder.type.LEAD);
如果(列==0){
border.type.add(DotBorder.type.WEST);
}
if(column==getColumnCount()-1){
border.type.add(DotBorder.type.EAST);
}
}
}
@重写公共组件预处理程序(
TableCellRenderer(tcr、int行、int列){
JComponent c=(JComponent)super.prepareRenderer(tcr,行,列);
c、 订单(dotBorder);
UpdateOrderType(
点边界,行==getSelectionModel()。getLeadSelectionIndex(),列);
返回c;
}
};
表1.setShowGrid(假);
表.setIntercellSpacing(新尺寸());
JPanel p=newjpanel(newborderlayout());
p、 添加(新JScrollPane(表));
返回p;
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@重写公共无效运行(){
createAndShowGUI();
}
});
}
公共静态void createAndShowGUI(){
JFrame=新JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(新的arounderRowFocusTest().makeUI());
框架设置尺寸(320240);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
}
类DotBorder扩展了EmptyByOrder{
公共枚举类型{LEAD,WEST,EAST;}
public EnumSet type=EnumSet.noneOf(type.class);
私有静态最终基本行程虚线=新基本行程(
1f,基本行程。端盖。对接,基本行程。连接。斜接,
10f,(新浮点数[]{1f}),0f;
专用静态最终颜色点_颜色=新颜色(200、150、150);
公共点边界(int-top、int-left、int-bottom、int-right){
超级(顶部、左侧、底部、右侧);
}
@重写公共布尔值isborder不透明(){
返回true;
}
@覆盖公共边界(
元件c、图形g、整数x、整数y、整数w、整数h){
Graphics2D g2=(Graphics2D)g.create();
g2.平移(x,y);
g2.设置油漆(点颜色);
g2.设定行程(虚线);
if(type.contains(type.WEST)){
g2.抽绳(0,0,0,h);
}
if(type.contains(type.EAST)){
g2.抽绳(w-1,0,w-1,h);
}
if(type.contains(type.LEAD)){
如果(c.getBounds().x%2==0){
g2.抽绳(0,0,w,0);
g2.抽绳(0,h-1,w,h-1);
}否则{
g2.抽绳(1,0,w,0);
g2.抽绳(1,h-1,w,h-1);
}
}
g2.dispose();
}
}
我想,您需要定制边框
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class AroundEntireRowFocusTest {
String[] columnNames = {"A", "B", "C"};
Object[][] data = {
{"aaa", 12, "ddd"}, {"bbb", 5, "eee"}, {"CCC", 92, "fff"}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
@Override public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
public JComponent makeUI() {
UIManager.put("Table.focusCellHighlightBorder", new DotBorder(2, 2, 2, 2));
JTable table = new JTable(model) {
private final DotBorder dotBorder = new DotBorder(2, 2, 2, 2);
void updateBorderType(DotBorder border, boolean isLeadRow, int column) {
border.type = EnumSet.noneOf(DotBorder.Type.class);
if (isLeadRow) {
border.type.add(DotBorder.Type.LEAD);
if (column == 0) {
border.type.add(DotBorder.Type.WEST);
}
if (column == getColumnCount() - 1) {
border.type.add(DotBorder.Type.EAST);
}
}
}
@Override public Component prepareRenderer(
TableCellRenderer tcr, int row, int column) {
JComponent c = (JComponent) super.prepareRenderer(tcr, row, column);
c.setBorder(dotBorder);
updateBorderType(
dotBorder, row == getSelectionModel().getLeadSelectionIndex(), column);
return c;
}
};
table.setShowGrid(false);
table.setIntercellSpacing(new Dimension());
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(table));
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new AroundEntireRowFocusTest().makeUI());
frame.setSize(320, 240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class DotBorder extends EmptyBorder {
public enum Type { LEAD, WEST, EAST; }
public EnumSet<Type> type = EnumSet.noneOf(Type.class);
private static final BasicStroke dashed = new BasicStroke(
1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER,
10f, (new float[] {1f}), 0f);
private static final Color DOT_COLOR = new Color(200, 150, 150);
public DotBorder(int top, int left, int bottom, int right) {
super(top, left, bottom, right);
}
@Override public boolean isBorderOpaque() {
return true;
}
@Override public void paintBorder(
Component c, Graphics g, int x, int y, int w, int h) {
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(x, y);
g2.setPaint(DOT_COLOR);
g2.setStroke(dashed);
if (type.contains(Type.WEST)) {
g2.drawLine(0, 0, 0, h);
}
if (type.contains(Type.EAST)) {
g2.drawLine(w - 1, 0, w - 1, h);
}
if (type.contains(Type.LEAD)) {
if (c.getBounds().x % 2 == 0) {
g2.drawLine(0, 0, w, 0);
g2.drawLine(0, h - 1, w, h - 1);
} else {
g2.drawLine(1, 0, w, 0);
g2.drawLine(1, h - 1, w, h - 1);
}
}
g2.dispose();
}
}
import java.awt.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.table.*;
公共类AroundireRowFocusTest{
字符串[]columnNames={“A”、“B”、“C”};
对象[][]数据={
{“aaa”,12,“ddd”},{“bbb”,5,“eee”},{“CCC”,92,“fff”}
};
DefaultTableModel=新的DefaultTableModel(数据、列名){
@重写公共类getColumnClass(int列){
返回getValueAt(0,列).getClass();
}
};
公共JComponent makeUI(){
UIManager.put(“Table.focusCellHighlightBorder”,新的点边界(2,2,2,2));
JTable表格=新JTable(型号){
私有最终点边界点边界=新点边界(2,2,2,2);
void updateOrderType(点边框、布尔isLeadRow、int列){
border.type=EnumSet.noneOf(DotBorder.type.class);
如果(isLeadRow){
border.type.add(DotBorder.type.LEAD);
如果(列==0){
border.type.add(DotBorder.type.WEST);
}
if(column==getColumnCount()-1){
border.type.add(DotBorder.type.EAST);
}
}
}
@重写公共组件预处理程序(
TableCellRenderer(tcr、int行、int列){
JComponent c=(JComponent)super.prepareRenderer(tcr,行,列);
c、 订单(dotBorder);
UpdateOrderType(
点边界,行==getSelectionModel()。getLeadSelectionIndex(),列);
返回c;
}
};
表1.setShowGrid(假);
表.setIntercellSpacing(新尺寸());
JPanel p=newjpanel(newborderlayout());
p、 添加(新JScrollPane(表));
返回p;
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@重写公共无效运行(){
createAndShowGUI();
}
});
}
公共静态void createAndShowGUI(){
JFrame=新JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(新的arounderRowFocusTest().makeUI());
框架设置尺寸(320240);
帧设置相对位置(nu