Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable行可选择,但单元格不可选择_Java_Swing_Jtable_Row - Fatal编程技术网

Java JTable行可选择,但单元格不可选择

Java 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

默认情况下,JTable是可编辑的,当我们选择任何一行时,就会得到这种GUI


这里我们有两个边框,一个围绕整行,另一个围绕选择行的特定单元格。我需要外部边框(围绕整行),但不需要内部边框(每个单元格)。有没有办法做到这一点。

我想,您需要定制一个
边框

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