JTable
の別のデザイン/モデルを私のシステムに追加したいと思います。シンプルなデザインですが、私にとって(初心者として)私はこの種のテーブルを設定するのが難しいです。テーブルを次のようにします: JTableの別のモデルを作成するには?
Javaでこのようなテーブルを設計することは可能ですか?あなたに何か考えてもらってください。
JTable
の別のデザイン/モデルを私のシステムに追加したいと思います。シンプルなデザインですが、私にとって(初心者として)私はこの種のテーブルを設定するのが難しいです。テーブルを次のようにします: JTableの別のモデルを作成するには?
Javaでこのようなテーブルを設計することは可能ですか?あなたに何か考えてもらってください。
...ここ
が、私は私自身の実装でヘッダを交換しました、にタイプDouble
のデフォルトのセルレンダリングを設定私自身のTableCellRenderer
とテーブルのinbuiltプロパティのいくつかを調整します。
public class FancyTable {
public static void main(String[] args) {
new FancyTable();
}
public FancyTable() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JTable table = new JTable(new LoanModel());
table.setTableHeader(new SingleColumnTableHeader());
table.setFillsViewportHeight(true);
table.setShowHorizontalLines(true);
table.setShowVerticalLines(false);
table.setGridColor(Color.LIGHT_GRAY);
table.setDefaultRenderer(Double.class, new CurrencyRenderer());
JScrollPane scrollPane = new JScrollPane(table);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(scrollPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class LoanModel extends AbstractTableModel {
private List<Loan> loans;
public LoanModel() {
loans = new ArrayList<Loan>(25);
loans.add(new Loan("Davies S.J", 2500000));
loans.add(new Loan("Lucas M.M", 1700000));
loans.add(new Loan("Smith R.B", 600000));
loans.add(new Loan("Jones T.T", 435000));
loans.add(new Loan("Brown R.B", 600000));
loans.add(new Loan("Walls T.T", 435000));
loans.add(new Loan("Healy R.B", 600000));
loans.add(new Loan("Taylor T.T", 435000));
loans.add(new Loan("Ginns R.B", 600000));
loans.add(new Loan("Murphy H", 435000));
}
@Override
public int getRowCount() {
return loans.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
Class clazz = String.class;
switch (columnIndex) {
case 1:
clazz = Double.class;
break;
}
return clazz;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object value = null;
Loan loan = loans.get(rowIndex);
switch (columnIndex) {
case 0:
value = loan.getName();
break;
case 1:
value= loan.getAmount();
break;
}
return value;
}
}
public class Loan {
private String name;
private double amount;
public Loan(String name, double amount) {
this.name = name;
this.amount = amount;
}
public String getName() {
return name;
}
public double getAmount() {
return amount;
}
}
public class CurrencyRenderer extends DefaultTableCellRenderer {
private Font boldFont;
public CurrencyRenderer() {
setHorizontalAlignment(JLabel.RIGHT);
boldFont = getFont().deriveFont(Font.BOLD);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Double) {
value = NumberFormat.getCurrencyInstance().format(value);
}
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setFont(boldFont);
return this;
}
}
public class SingleColumnTableHeader extends JTableHeader {
private JLabel renderer;
public SingleColumnTableHeader() {
setBackground(Color.WHITE);
renderer = new JLabel("Top Ten Loan Balances");
renderer.setBorder(new EmptyBorder(4, 0, 4, 0));
}
@Override
public Dimension getPreferredSize() {
return renderer.getPreferredSize();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
FontMetrics fm = g2d.getFontMetrics();
Insets insets = getInsets();
int width = getWidth() - (insets.left + insets.right);
int height = getHeight() - (insets.top + insets.bottom);
renderer.setBounds(insets.left, insets.top, width, height);
renderer.paint(g2d);
g2d.setColor(Color.LIGHT_GRAY);
g2d.setStroke(new BasicStroke(2f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2d.drawLine(insets.left, insets.top + height - 1, insets.left + width, insets.top + height - 1);
g2d.dispose();
}
}
}
あなたは同じように簡単に、独自のカスタムJTable
を作成して、テーブルのヘッダーのための独自のコンポーネントを設定するconfigureEnclosingScrollPane
をオーバーライドし、しかし、個人的に、私はそれはキル上だと思います。自分のレンダラを供給することができること
がはるかに柔軟なアプローチで、うちはしっかりと夫婦のコードを生成して、構成要素の再利用を促進する...
あなたはそれが便利How to use Tables
を通読することを見つけるかもしれませんは、それが私に起こった
を更新しました何かギョームが言った後、あなたは単にnull
にJTable
のヘッダを設定することができます。次に、スクロールペインにテーブルを追加したら、ユーザーJScrollPane#setColumnHeaderView
を入力して、ヘッダーをJLabel
のように設定します。
それが簡単にあなたがJTableHeader
+1これははるかに良い選択です。答えは –
+1です。だから私は** getTableCellRendererComponent **を使用する必要があります。どうもありがとうございます。 – Amarnath
JTableのprepareRendereメソッドをオーバーライドします。テキストを含む列1は1つのフォントを使用し、列2は別のフォントを使用します。
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
public class JTableExample {
public static void main(String[] args) {
Object[] column = {"Column One", "Column Two"};
Object[][] data = {{"One", "Two"}, {"Three", "Four"}, {"Five", "Five"}};
JTable toDoTable = new JTable(data, column) {
@Override
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex,
int columnIndex) {
if(columnIndex == 1) {
setFont(new Font("Arial", Font.BOLD, 12));
} else {
setFont(new Font("Arial", Font.ITALIC, 12));
}
return super.prepareRenderer(renderer, rowIndex, columnIndex);
}
};
JScrollPane jpane = new JScrollPane(toDoTable);
JPanel panel = new JPanel();
JFrame frame = new JFrame();
frame.setSize(new Dimension(400, 100));
frame.setTitle("JTable Font Setting Example");
panel.add(jpane);
frame.add(new JScrollPane(panel));
frame.setVisible(true);
}
}
UPDATE:
としてMadProgrammerとギヨームのPoletを示唆しています。 Iは、(参照としてギョームのPoletコードを使用。)DefaultTableCellRenderer
を使用して私のアプローチを変更し
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class JTableExample {
public static void main(String[] args) {
Object[] column = {"Column One", "Column Two"};
Object[][] data = {{"One", "Two"}, {"Three", "Four"}, {"Five", "Five"}};
JTable table = new JTable(data, column);
table.getColumnModel().getColumn(1).setCellRenderer(new CustomTableCellRenderer());
table.setShowGrid(false);
table.setTableHeader(null);
JLabel label = new JLabel("Top 10 by Loan Balance");
label.setFont(label.getFont().deriveFont(15.0f));
JScrollPane scroll = new JScrollPane(table);
JFrame frame = new JFrame();
frame.setSize(new Dimension(400, 100));
frame.setTitle("JTable Font Setting Example");
frame.add(label, BorderLayout.NORTH);
frame.add(scroll, BorderLayout.CENTER);
frame.setVisible(true);
}
}
class CustomTableCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object aValue,
boolean isSelected, boolean hasFocus, int rowIndex, int columnIndex) {
Component component = super.getTableCellRendererComponent(table, aValue, isSelected, hasFocus, rowIndex, columnIndex);
component.setFont(component.getFont().deriveFont(Font.BOLD));
return component;
}
}
PS:
table.setTableHeader(ヌル):=>列を非表示にしますつかいます。
DefaultTableCellRenderer:=>これはデフォルトテーブルセル レンダラーを返します。したがって、これを使用して1列目のフォントスタイルを作成します。
table.setShowGrid(false); =>これにより、JTable内の行が として表示されなくなります。あなたがこの結果を達成できるさまざまな方法がたくさんあります
上記の例ではテーブルヘッダーがありません。 Javaで可能ですか? –
"貸出残高上位10"というラベルを意味するならば、私はそれを 'JLabel'を使ってテーブルの上に置きます。 –
はい、明らかです。それはラベルです。私にとって重要なのは、上下の境界線と隠れた見出しだけです。 jTableでこのようなことをする方法。 –
を所有し、それを行うにはさらに別の方法を実装することでしょう。適切なCellRendererを使用して、さまざまなスタイルを実現し、テキストの整列を管理します。 TableHeaderを消すには、JTable
のnull
に設定するだけです。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.Random;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableCellRenderer;
public class TestTableHeader {
public static class BoldTableCellRenderer extends DefaultTableCellRenderer {
public BoldTableCellRenderer() {
setHorizontalAlignment(RIGHT);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
renderer.setFont(renderer.getFont().deriveFont(Font.BOLD));
return renderer;
}
}
protected void initUI() {
Vector<Vector<Object>> datas = new Vector<Vector<Object>>();
Vector<String> colNames = new Vector<String>();
for (int i = 0; i < 2; i++) {
colNames.add("Col-" + (i + 1));
}
for (int i = 0; i < 15; i++) {
Vector<Object> data = new Vector<Object>();
data.add("John Smith (" + (i + 1) + ")");
data.add(new Random().nextInt(4000));
datas.add(data);
}
table = new JTable(datas, colNames);
table.setShowGrid(false);
table.getColumnModel().getColumn(1).setCellRenderer(new BoldTableCellRenderer());
table.setFillsViewportHeight(false);
table.setTableHeader(null);
table.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.GRAY));
JLabel label = new JLabel("Top 10 by Loan Balance");
label.setFont(label.getFont().deriveFont(15.0f));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
scrollpane = new JScrollPane(table);
scrollpane.setRowHeaderView(null);
frame.add(label, BorderLayout.NORTH);
frame.add(scrollpane, BorderLayout.CENTER);
frame.setSize(300, 200);
frame.setVisible(true);
}
private JTable table;
private JScrollPane scrollpane;
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTableHeader().initUI();
}
});
}
}
+1 OPがしたいことがあれば、ヘッダーとして 'JLabel'を表示していましたが、' JLabel'を使って 'JScrollPane'にテーブルを追加してからスクロールペインのヘッダービューを設定することができますヌルヘッダー+1! – MadProgrammer
です。しかし、何を試しましたか? – Logan
私はいつもjTableの共通/従来のモデルで終わった。テーブルのヘッダー、セルと共通の境界線。 –
ああ、あなたはそれの外観について話しています。モデルでは、カスタムの列名やセルの種類などについて 'JTableModel'について話していると思っていました。 – Logan