2009-06-04 12 views
0

非常に複雑な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(); 
        } 
     }); 
    } 
} 

答えて

0

に関連している可能性があり、問題は、コンポーネントが初期化された順序でいたとスプリットペインに追加しました。したがって、最終的な修正は、パネルに分割ペインを追加する前に、分割ペインを実際にパネルに追加するまで、分割ペインにテーブルを追加するのを遅らせることでした。その小さな変化を起こして問題を解決しました。

0

、私は実際に問題を示し、小さなアプリを取得することはできませんが、私は私のレイアウトを示したアプリです次善の策を持っています(もちろん、実際には同じ問題はありません)。

投稿されたコードはうまくいきましたが、私はこれを読んでいます。

とにかく、ミックスに追加したすべてのカスタムコンポーネントに問題があるようです。 JTableとJSplitPaneがうまく動作します。

それが動作するまで、私は何だろうが1で部品1を除去するものである(コードが掲載さ1と同様のものであり、他に何も存在しない場合に、おそらく私は動作します)

それとも反対の道を行くことができますそれは簡単です。サンプルコードから始めて、それが失敗するまで、ますます多くのコンポーネントを追加してください。

この機会に、コードをリファクタリングして消去し、不要なコンポーネントを移動することができます。さらに、プロセス内にテストケースを追加することもできます。

幸運。

+0

私はこれをやっています - これは私のコードではなく、私は別のシステムで働いていて、必要なものすべてにアクセスできません。このカスタムコンポーネントでは、デコンパイラを使用しなければなりませんでした)。私は分割されたペインに持ってきました。すべてが正常に機能しますが、カスタムテーブルが分割ペインに配置されると、その配置はオフになります。 –

0

ハードウェアに関連するかどうかを確認するために別のボックスで実行しようとしましたか?

がこのバグ結局のところ

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4763448

+0

私はそのバグを見ましたが、これを試したマシンでバグを再現しようとしましたが、バグが原因ではないように見えます。私は別のマシンを試しましたが、それぞれに同じ効果があります。 –

関連する問題