java - 如何将 JTable 列向右对齐,但在左侧将其切断?
问题描述
这个现有的问题要求在左对齐的列中进行左截止。这个问题是关于右对齐列中的左截止。
解决方案
这是一个不会在左侧生成省略号的想法,但我发现无论如何我更喜欢立即切断,以显示尽可能多的信息。
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);
}
}
}
}
推荐阅读
- extjs - 允许在 ExtJS 7 Modern 中重新排序网格列
- css - 如何使材质 ui 图标更薄
- css - 防止变换中的边缘像素化
- swift - PluginError:无法将传入配置转换为 JSONValue
- python - 当我运行我的代码时,为什么椭圆/圆没有出现
- amazon-web-services - 将 AWS CloudFront 查看器请求标头传递到 s3 源
- spring - 为什么将会话创建策略设置为无状态会破坏我的 oauth2 应用程序
- javascript - 如何为不同的页面制作按钮?
- ruby-on-rails - Ruby 环境搞砸了
- typescript - 如何在 React Navigation 中键入 Partial State 对象?