首页 > 解决方案 > 如何将 JTable 列向右对齐,但在左侧将其切断?

问题描述

这个现有的问题要求在左对齐的列中进行左截止。这个问题是关于右对齐列中的左截止。

标签: javaswingjtable

解决方案


这是一个不会在左侧生成省略号的想法,但我发现无论如何我更喜欢立即切断,以显示尽可能多的信息。

演示

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.plaf.basic.BasicLabelUI;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TableColumnRightAlignedLeftCutoff
{
  public static void main(String[] args)
  {
    DefaultTableModel model = new DefaultTableModel(new String[] { "default", "custom" }, 0);
    model.addRow(new String[] { "short", "short" });
    model.addRow(new String[] { "long long long long long", "long long long long long" });
    JTable table = new JTable(model);
    table.setShowGrid(false);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    DefaultTableCellRenderer defaultRenderer = new DefaultTableCellRenderer();
    defaultRenderer.setHorizontalAlignment(SwingConstants.RIGHT);
    table.getColumn("default").setCellRenderer(defaultRenderer);
    table.getColumn("custom").setCellRenderer(new RightAlignedRenderer());

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getRootPane().setLayout(new BorderLayout());
    frame.getRootPane().add(new JScrollPane(table), BorderLayout.CENTER);
    frame.setSize(600, 400);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }

  private static class RightAlignedRenderer extends DefaultTableCellRenderer
  {
    private int m_currentCellWidth = 0;

    public RightAlignedRenderer()
    {
      setUI(new RightAlignedRendererUI());
      setHorizontalAlignment(SwingConstants.RIGHT);
      setOpaque(false);
    }

    @Override
    public void setBounds(int x, int y, int width, int height)
    {
      m_currentCellWidth = width;
      // make the label think that it has a lot of space to layout the text
      super.setBounds(x, y, 1000, height);
    }

    private class RightAlignedRendererUI extends BasicLabelUI
    {
      @Override
      public void paint(Graphics g, JComponent c)
      {
        ((Graphics2D) g).translate(-1000 + m_currentCellWidth, 0);
        super.paint(g, c);
      }
    }
  }
}

推荐阅读