我正在JTableNetbeans 中創建一個,并且在結構上有三個小問題。
- 我似乎無法將我的桌子對準我想要的方向(比如北、東、南或西),現在它煩人地懸停在我的 JButton 上。
- 如果我更改變數,我撰寫的用于設定 JTable 尺寸的代碼不會執行任何操作。
- 我撰寫的添加 JScrollPane 的代碼在運行時沒有顯示出來。
我理解如果您不能解決所有三個問題,但我想我會將它們全部放在一個而不是三個不同的問題中,因此感謝您對問題的任何幫助!
**另請注意,忽略ActionListener. 我最終會讓代碼讀取一個文本檔案并將該資料排序為ArrayList. 然后以某種方式進入表格,而不是我在此示例中手動設定它的方式。
這是我的代碼(問題區域在注釋中以粗體大寫字體標記):
主要的:
package libraryinventory;
import javax.swing.JFrame;
import java.io.*;
public class MainClass {
static String[] bookArray;
public static void main(String[] args) {
GUICommandFunctions guiDemo = new GUICommandFunctions();
//What to do when window closes
guiDemo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// size of window in pixels
guiDemo.setSize(1000, 720);
//make window visible
guiDemo.setVisible(true);
}
}
圖形界面類:
package libraryinventory;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.*;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Box;
import static javax.swing.Box.createHorizontalBox;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
public class GUICommandFunctions extends JFrame {
private JButton ButtonOne;
private JTable jt;
public GUICommandFunctions() {
this.setTitle("Library Inventory"); //Name of window
JPanel panel = new JPanel();
this.add(panel, BorderLayout.CENTER); //Location of panel for JButton
ButtonOne = LibraryContentButton();
panel.add(ButtonOne); //adding panel to JFrame
String[] columns = {"Title", "Author/Language", "Publisher", "Page Count", "Version Number/Genre/Topic", "Part of a series/Illustrator"}; //columns of the JTable
String[][] data = {{"The Keto Cookbook", "Chronicle Books", "304", "English", "Keto Cooking", "null"}, //data under the columns
{"The Hitchhiker's Guide to the Galaxy", "Del Rey", "224", "Douglas Adams", "Fantasy", "Y"}
};
jt = new JTable(data, columns){ //Makes it so can't edit data inside table once ran
public boolean isCellEditable(int data, int columns) {
return false;
}
};
jt.setPreferredScrollableViewportSize(new Dimension(450, 63)); //Set size. **HERE IS PROBLEM #2**
jt.setFillsViewportHeight(true); //Set visible
jt.setVerticalAlignment(JTable.BOTTOM_ALIGNMENT); //**HERE IS PROBLEM #1**
JScrollPane jps = new JScrollPane(jt); //add scroll **HERE IS PROBLEM #3**
add(jps);
}
private JButton LibraryContentButton() { //
JButton content = new JButton("Click to view all content");
content.setFocusable(false);
content.setBackground(Color.DARK_GRAY);
content.setForeground(Color.WHITE);
content.setFont(new Font("Arial", Font.BOLD, 20));
content.setToolTipText("Shows content of the entire library in a neatly ordered JTable");
content.setMargin(new Insets(10, 10, 10, 10));
content.setPreferredSize(new Dimension(300, 75));
content.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(rootPane, "Eventually will make this button load up the JTable");
}
});
return content;
}
static {
int arrayCount;
FileReader fr = null;
try {
fr = new FileReader("C:\\Users\\Mark Case\\Documents\\NetBeansProjects\\LibraryInventory\\src\\libraryinventory\\library.txt"); //Reads in text file
} catch (FileNotFoundException ex) {
Logger.getLogger(GUICommandFunctions.class.getName()).log(Level.SEVERE, null, ex);
}
BufferedReader reader = new BufferedReader(fr);
ArrayList<String> str = new ArrayList<>();
String line = "";
arrayCount = 0;
try {
while((line=reader.readLine())!=null) {
str.add(line);
arrayCount = arrayCount 1;
}
} catch (IOException ex) {
Logger.getLogger(GUICommandFunctions.class.getName()).log(Level.SEVERE, null, ex);
}
// Here we would actually set the type to what the user wants (note: Set it to a "0" if the user wants all Books)
String selType = "2";
// Call method to select Books by category type
String methodResult = SelectType(str, arrayCount, selType);
}
private static String SelectType (ArrayList<String> str, int arrayCount, String selType) {
for (int i = 1; i < arrayCount; i ) {
String buffer = str.get(i);
String bookCat = buffer.substring(0,1);
// Print books by Category - "0" type means print all Books
if (selType.equals(bookCat)) {
System.out.println(buffer);
}
else if (selType.equals("0")) {
System.out.println(buffer);
}
}
return "0";
}
}
uj5u.com熱心網友回復:
所以,讓我們快速看一下建構式......
public GUICommandFunctions() {
//...
JPanel panel = new JPanel();
this.add(panel, BorderLayout.CENTER); //Location of panel for JButton
ButtonOne = LibraryContentButton();
panel.add(ButtonOne); //adding panel to JFrame
//...
jt.setPreferredScrollableViewportSize(new Dimension(450, 63)); //Set size. **HERE IS PROBLEM #2**
jt.setFillsViewportHeight(true); //Set visible
jt.setVerticalAlignment(JTable.BOTTOM_ALIGNMENT); //**HERE IS PROBLEM #1**
JScrollPane jps = new JScrollPane(jt); //add scroll **HERE IS PROBLEM #3**
add(jps);
}
你添加panel到CENTER. 由于您直接從 擴展JFrame,因此布局已經是BorderLayout,所以這很好。
但是隨后添加jpsusing add(jps);,這會將組件添加到布局的默認位置,在 is 的情況BorderLayout下CENTER。這是有問題的,因為BorderLayout只允許在每個位置管理一個組件,這解釋了為什么你setPreferredScrollableViewportSize不作業,因為BorderLayout忽略它,并使組件填充可用空間CENTER
所以,我修改了你的代碼。JPanel首先,我從而不是擴展JFrame。通常不鼓勵JFrame直接擴展,您不會向類添加任何新功能,將自己鎖定在單個用例中,這通常只會讓您生活得更加困難。
其次,我JScrollPane把SOUTHBorderLayout

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new GUICommandFunctionsPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class GUICommandFunctionsPane extends JPanel {
private JButton ButtonOne;
private JTable jt;
public GUICommandFunctionsPane() {
setLayout(new BorderLayout());
JPanel panel = new JPanel();
this.add(panel, BorderLayout.CENTER); //Location of panel for JButton
ButtonOne = LibraryContentButton();
panel.add(ButtonOne); //adding panel to JFrame
String[] columns = {"Title", "Author/Language", "Publisher", "Page Count", "Version Number/Genre/Topic", "Part of a series/Illustrator"}; //columns of the JTable
String[][] data = {{"The Keto Cookbook", "Chronicle Books", "304", "English", "Keto Cooking", "null"}, //data under the columns
{"The Hitchhiker's Guide to the Galaxy", "Del Rey", "224", "Douglas Adams", "Fantasy", "Y"}
};
jt = new JTable(data, columns) { //Makes it so can't edit data inside table once ran
public boolean isCellEditable(int data, int columns) {
return false;
}
};
jt.setPreferredScrollableViewportSize(new Dimension(450, 63)); //Set size. **HERE IS PROBLEM #2**
jt.setFillsViewportHeight(true); //Set visible
JScrollPane jps = new JScrollPane(jt);
add(jps, BorderLayout.SOUTH);
}
private JButton LibraryContentButton() { //
JButton content = new JButton("Click to view all content");
content.setFocusable(false);
content.setBackground(Color.DARK_GRAY);
content.setForeground(Color.WHITE);
content.setFont(new Font("Arial", Font.BOLD, 20));
content.setToolTipText("Shows content of the entire library in a neatly ordered JTable");
content.setMargin(new Insets(10, 10, 10, 10));
content.setPreferredSize(new Dimension(300, 75));
content.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(GUICommandFunctionsPane.this, "Eventually will make this button load up the JTable");
}
});
return content;
}
// static {
//
// int arrayCount;
//
// FileReader fr = null;
//
// try {
// fr = new FileReader("C:\\Users\\Mark Case\\Documents\\NetBeansProjects\\LibraryInventory\\src\\libraryinventory\\library.txt"); //Reads in text file
// } catch (FileNotFoundException ex) {
// Logger.getLogger(GUICommandFunctionsPane.class.getName()).log(Level.SEVERE, null, ex);
// }
//
// BufferedReader reader = new BufferedReader(fr);
// ArrayList<String> str = new ArrayList<>();
// String line = "";
// arrayCount = 0;
// try {
// while ((line = reader.readLine()) != null) {
// str.add(line);
// arrayCount = arrayCount 1;
//
// }
// } catch (IOException ex) {
// Logger.getLogger(GUICommandFunctionsPane.class.getName()).log(Level.SEVERE, null, ex);
// }
//
// // Here we would actually set the type to what the user wants (note: Set it to a "0" if the user wants all Books)
// String selType = "2";
//
// // Call method to select Books by category type
// String methodResult = SelectType(str, arrayCount, selType);
//
// }
//
// private static String SelectType(ArrayList<String> str, int arrayCount, String selType) {
// for (int i = 1; i < arrayCount; i ) {
//
// String buffer = str.get(i);
// String bookCat = buffer.substring(0, 1);
//
// // Print books by Category - "0" type means print all Books
// if (selType.equals(bookCat)) {
// System.out.println(buffer);
// } else if (selType.equals("0")) {
// System.out.println(buffer);
// }
// }
// return "0";
// }
}
}
哦,我不鼓勵您以static這種方式使用初始化程式,相反,這需要進入建構式,或者您應該使用某種形式的依賴注入將資訊傳遞給類
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/429883.html
