有必要在任何时候启用水平滚动条吗?
情况就是这样:我有一个JTable
单元格存储了很长的数据.因此,我需要有水平滚动条.
有人对此有所了解吗?
如果您运行下面的小样本,您将看到中心区域周围的边框.我不确定为什么会出现这种边界.
当JTable在JScrollPane中时会发生这种情况.我尝试了各种各样的东西去除它,但到目前为止没有运气.没有JScrollPane的JTable没有显示边框.
见下面的示例.TIA.
public class TestScrollPane extends JFrame {
public static void main(String[] args) {
JFrame frame = new TestScrollPane();
JPanel panel = new JPanel();
JTable table = new JTable();
panel.setLayout(new BorderLayout());
panel.add(new JLabel("NORTH"), BorderLayout.NORTH);
panel.add(new JLabel("SOUTH"), BorderLayout.SOUTH);
JScrollPane sp = new JScrollPane(table);
// None of these have any effect
sp.setBorder(null);
sp.getInsets().set(0, 0, 0, 0);
sp.setViewportBorder(null);
sp.getViewport().setBorder(null);
sp.getViewport().getInsets().set(0, 0, 0, 0);
sp.getViewport().setOpaque(true);
panel.add(sp, BorderLayout.CENTER);
// Adding the table alone shows no border
// panel.add(table, BorderLayout.CENTER);
frame.add(panel);
frame.setVisible(true);
}
public TestScrollPane() …
Run Code Online (Sandbox Code Playgroud) 我用Google搜索了一整天,没有运气.getnPrintAllData()
按OK按钮后调用方法.所以代码是:
public class DatabaseSQLiteConnection {
Connection conn = null;
PreparedStatement statement = null;
ResultSet res = null;
public DatabaseSQLiteConnection(){
try{
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:test.sqlite");
statement = conn.prepareStatement("SELECT * from product_info;");
}
catch(Exception e){
e.printStackTrace();
}
}
public void getnPrintAllData(){
String name, supplier, id;
DefaultTableModel dtm = new DefaultTableModel();
Window gui = new Window(); //My JPanel class
try{
res = statement.executeQuery();
testResultSet(res);
ResultSetMetaData meta = res.getMetaData();
int numberOfColumns = meta.getColumnCount();
while (res.next())
{
Object [] rowData = new Object[numberOfColumns]; …
Run Code Online (Sandbox Code Playgroud) 如何设置JTable以便能够将行拖动到表中的不同索引.例如,如果我有5行,我想将第4行拖到第2位?
我正在尝试实现本教程中描述的自定义TableRenderer .我想让渲染器换行包装给定单元格的每个文本.这个想法是,使用TextArea作为渲染器,因为它支持换行.但是,以下代码的行为不符合预期:
public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
this.setText((String)value);
this.setWrapStyleWord(true);
this.setLineWrap(true);
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
我用这个渲染器设置了
table.setDefaultRenderer(String.class, new LineWrapCellRenderer());
Run Code Online (Sandbox Code Playgroud)
但是细胞条目仍未解开.如果我添加this.setBackground(Color.YELLOW)
到该getTableCellRendererComponent()
方法,所有单元格都按预期为黄色,但未包装.
有任何想法吗?
更新:正如Michael Borgwardt在评论中所述,问题不在于换行,而是行高:JTables行是固定大小的,所以如果单元格越来越高(因为文本现在是多行的),我们必须增加行高.但是多少钱?我会检查这是否值得另一个SO问题.如果没有,我会在这里添加此解决方案.
Update2:以下代码将确定行高(如果放入getTableCellRendererComponent()
):
int fontHeight = this.getFontMetrics(this.getFont()).getHeight();
int textLength = this.getText().length();
int lines = textLength / this.getColumns() +1;//+1, cause we need at least 1 row.
int height = fontHeight * …
Run Code Online (Sandbox Code Playgroud) 简短:我需要一个"右键单击事件"来突出显示单元格行.
我在Java Swing(Netbeans Matisse)的ScrollPane中使用JTable.我在JTable上有一个MouseClicked事件监听器,它执行以下操作:
if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {
System.out.println("Right Click");
JPopUpMenu.show(myJTable, evt.getX(), evt.getY())
}
Run Code Online (Sandbox Code Playgroud)
问题是......每当我在JTable上执行右键单击时,行都不会突出显示(我将选择设置为行仅btw).我找了几个setSelected()函数但找不到合适的函数.默认情况下,左键单击会自动突出显示该行.如何设置右键点击?
我很好奇如何valueChanged
在JTable
双击行中时调用重写方法.现在,下面的代码片段实现了一个单击操作或事件箭头键,以便在人员列表中导航并进行相应调整JLabel
.我正在尝试做的是类似于我点击一次的类似事情,但这次IF和ONLY如果双击一行dto
就会改变其他事情.我该怎么做呢 :(
class ListDataUI {
public void addListSelectionListener(ListSelectionListener listSelectionListener) {
summaryTable.getSelectionModel().addListSelectionListener(listSelectionListener);
public T getSelectedDTO() {
final int selectedRowIndex = summaryTable.getSelectedRow();
if (selectedRowIndex != -1) {
return data.get(summaryTable.convertRowIndexToModel(selectedRowIndex));
} else {
return null;
}
}
}
}
class MainMenu extends javax.swing.JFrame {
private void initListeners() {
searchTable.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
AcademicDTO dto = (AcademicDTO) searchTable.getSelectedDTO();
acImgLabel.setIcon(new ImageIcon());
label_name.setText(dto.getTitle() + " " + dto.getForename() + " …
Run Code Online (Sandbox Code Playgroud) 我需要我的JTable自动重新调整其列宽以适应内容.我发现这个TableColumnAdjuster
课非常有用.但是有一个小问题.假设我有5列,其内容非常短.在这种情况下,如果我使用自动调整器,它会根据内容设置前四列宽度,并将所有剩余空间给予最后一列.请看这个例子.
这里是最后一列,Balance
给出了所有多余的空间.但是,如果我需要将该空间提供给其中一个中间列,该怎么办呢?在上面的例子中,我需要将该空间分配给第三列,name
.我尝试修改TableColumnAdjuster
类的adjustColumns()
方法.但我无法让它发挥作用.
我尝试了两种方法column.setPreferredWidth()
并column.setWidth()
改变了色谱柱尺寸.但似乎它没有改变任何东西.如何有效地更改a的列大小JTable
.如果还有其他替代方案或直接回答我的主要问题,那就更好了.谢谢!
我需要删除JTable中的所有行.
我尝试了以下两种方法:
/**
* Removes all the rows in the table
*/
public void clearTable()
{
DefaultTableModel dm = (DefaultTableModel) getModel();
dm.getDataVector().removeAllElements();
revalidate();
}
Run Code Online (Sandbox Code Playgroud)
和
((DefaultTableModel)table.getModel()).setNumRows(0);
Run Code Online (Sandbox Code Playgroud)
两者都不会删除所有行.有任何想法吗?
java ×10
jtable ×10
swing ×10
jscrollpane ×2
double-click ×1
jscrollbar ×1
jtableheader ×1
mouse ×1
right-click ×1
sqlite ×1
tablecolumn ×1