非常に複雑なEclipseベースのアプリケーションの内部で作業しており、JSplitPane内のJTableベースのカスタムコンポーネントに問題があります。実際にアクセスできるアプリケーションの部分は、パネル内、パネル内、パネル内、実際のアプリケーション内であるため、間違っていることがたくさんあります。JTableがクリック時に間違ったセルを選択する
私が今直面している具体的な問題は、テーブルコンポーネントがクリックすると間違ったセルを選択していることです。行0、列0のセルを選択した場合、実際に選択されるセルは、実際のクリックより約20ピクセル下の行2の列0にあります。これは、テーブルがJSplitPaneにある場合にのみ発生します。テーブル自体をパネルに追加するだけで、セルの選択は正しいです。
テーブルがJSplitPaneにあるため、テーブルの境界(またはテーブルを含むスクロールペインのビューポート)が約20ピクセルずれていることがわかります。この理論を裏付けることができるもう一つの問題は、テーブルをスクロールするとテーブルの上に再ペイントが発生するということです。たとえば、スクロールしたときにテーブルスクロールの代わりに実際には上に移動しました)スクロールする前に約20ピクセル。テーブルを含むスクロールペインに
jscrollpane.getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);
を追加することで、この問題を回避できました。
すべてのカスタムコンポーネントが関係しているので、私は実際問題を示す小さなアプリケーションを手に入れることはできませんが、私は次のベストを尽くしています。実際には同じ問題はありません)。問題を引き起こしている可能性のあるアイデアはありますか?そのため関係するすべてのカスタムコンポーネントの
//Test class showing layout of table/splitpane
import javax.swing.*;
import java.awt.*;
public class SplitTest
{
private static JFrame frame;
private static JPanel buildTable()
{
JPanel tblPanel = new JPanel();
tblPanel.setLayout(new BorderLayout());
String[] cols = new String[]{"one", "two", "three", "four", "five", "six", "seven"};
Object[][] data = new Object[30][7];
for(int x = 0;x < data.length;x++)
for(int y = 0;y < data[x].length;y++)
data[x][y] = x + ", " + y;
JTable tbl = new JTable(data, cols);
JScrollPane scrollPane = new JScrollPane(tbl);
tblPanel.add(scrollPane, BorderLayout.CENTER);
return tblPanel;
}
private static JPanel buildTab()
{
JPanel pnl = new JPanel();
pnl.setLayout(new BorderLayout());
JPanel menuPnl = new JPanel();
menuPnl.setLayout(new FlowLayout(FlowLayout.LEFT));
menuPnl.add(new JLabel("label"));
menuPnl.add(new JComboBox(new String[]{"one", "two"}));
menuPnl.add(new JButton("Button"));
pnl.add(menuPnl, BorderLayout.NORTH);
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
splitPane.setLeftComponent(buildTable());
JPanel bottomPnl = new JPanel();
bottomPnl.setPreferredSize(new Dimension(800, 200));
bottomPnl.setBackground(Color.RED);
splitPane.setRightComponent(bottomPnl);
splitPane.setDividerLocation(.5);
pnl.add(splitPane, BorderLayout.CENTER);
return pnl;
}
private static JTabbedPane buildGUI()
{
JTabbedPane topLevelTabbedFrame = new JTabbedPane();
topLevelTabbedFrame.addTab("Tab 1", buildTab());
topLevelTabbedFrame.addTab("Tab 2", new JPanel());
topLevelTabbedFrame.addTab("Tab 3", new JPanel());
return topLevelTabbedFrame;
}
private static void createAndShowGUI()
{
frame = new JFrame("Split Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(buildGUI(), BorderLayout.CENTER);
// frame.setSize(new Dimension(800, 600));
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) throws Exception
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}
私はこれをやっています - これは私のコードではなく、私は別のシステムで働いていて、必要なものすべてにアクセスできません。このカスタムコンポーネントでは、デコンパイラを使用しなければなりませんでした)。私は分割されたペインに持ってきました。すべてが正常に機能しますが、カスタムテーブルが分割ペインに配置されると、その配置はオフになります。 –