2011-11-29 65 views
1

如果我添加一個JTableJPanel然後添加JPanelJScrollPane,每當JTable獲得焦點,滾動窗格自動滾動到最底層,這是不好的。JScrollPane的問題

我有這樣做的很多原因,所以我希望有某種解決方案來阻止這種自動滾動。

OH,這就是踢球者......它似乎只在通過JNLP/WebStart運行應用程序時纔會發生,並且它不會在Eclipse中執行,這更令人沮喪。

這裏有一個簡單的例子,如果你通過JLNP啓動,單擊文本框,單擊表,然後將其自動滾動至底部:

import java.awt.*; 
import javax.swing.*; 

public class ScrollDemo extends JPanel{ 

private static final long serialVersionUID = 1L; 

public ScrollDemo() 
{ 
    this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
    JTable table = new JTable(100,6); 
    this.add(new JTextField()); 
    JPanel panel = new JPanel(); 
    panel.add(table); 
    JScrollPane scroll = new JScrollPane(panel); 
    this.add(scroll); 
} 

/** 
* Create the GUI and show it. For thread safety, this method should be 
* invoked from the event-dispatching thread. 
*/ 
private static void createAndShowGUI() { 
    // Create and set up the window. 
    JFrame frame = new JFrame("ScrollDemo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // Create and set up the content pane. 
    JComponent newContentPane = new ScrollDemo(); 
    newContentPane.setOpaque(true); // content panes must be opaque  
    frame.setContentPane(newContentPane); 
    frame.setPreferredSize(new Dimension(500, 500)); 

    // Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    // Schedule a job for the event-dispatching thread: 
    // creating and showing this application's GUI. 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
} 
+1

* 「嗯,謝謝你好看!」 *無後顧之憂。 ..你有問題嗎?你有代碼,JNLP文件等? –

+0

我的猜測是,它是輕彈表中的「選擇項」,這是它把在最後一個條目,咋一看,我不能找到一種方法,所選條目設置回後的第一個不幸的是,你知道一種方法來改變選定的條目嗎? –

回答

-1

this,更改選擇您JTable您需要更改選擇模型。嘗試使用以下內容將所選項目設置爲第一個項目。

ListSelectionModel selectionModel = table.getSelectionModel(); 
selectionModel.setSelectionInterval(start, end); 

看看這是否給重點放在JTable的頂部?

編輯:我沒有做過這個之前,所以不知道什麼開始和結束將需要嘗試0,0或0,1也許?

+0

-1玩猜謎遊戲。 _try 0,0或0,1 maybe_也許你可以試過它?這就是代碼很好的例子;-) – kleopatra

2

我無法重現該問題,但我可以提供一些意見:

  1. 幀的add()方法轉發組件自動contentPane

  2. 而不是設置框架的首選大小,請在表格上使用setPreferredScrollableViewportSize()

  3. 如果不需要的滾動是由於更新表格的模型造成的,請參閱example如何暫停滾動。

  4. 使用event dispatch thread的榮譽。

  5. 附加:具有(默認)FlowLayout的嵌套panel是多餘的。

enter image description here

import java.awt.*; 
import javax.swing.*; 

/** @see https://stackoverflow.com/questions/8319388 */ 
public class ScrollDemo extends JPanel { 

    public ScrollDemo() { 
     this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
     JTable table = new JTable(100, 6); 
     table.setPreferredScrollableViewportSize(new Dimension(320, 240)); 
     this.add(new JTextField()); 
     this.add(new JScrollPane(table)); 
    } 

    private static void createAndShowGUI() { 
     // Create and set up the window. 
     JFrame frame = new JFrame("ScrollDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Create and set up the content pane. 
     frame.add(new ScrollDemo()); 
     frame.pack(); 

     // Display the window. 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

綜合+1! –

+0

如你所知,這個設置是從有機磷農藥:-) – kleopatra

+0

@kleopatra不同:良好的出發點。我試圖列出所有的差異,因爲我不確定哪些是有意的,哪些不是。和安德魯一樣,我對這個問題的'jnlp'方面很好奇。 – trashgod

0

我已經對JTable中自動滾動的問題時,我將它們放在一箇中間的JPanel,而不是直接將它們作爲JScrollPane的視口的。在這些情況下,刪除多餘的面板並將表格直接放在滾動窗格上可以解決我的問題。

+0

對,我也注意到了,但就像我說的,有很多原因,我希望有一箇中介的JPanel在那裏。我很高興我不是唯一注意到這個問題的人:)現在我們只需要一個解決方案,不涉及重新構建我的表格/滾動窗格佈局...... – PAULUS

0

那麼,我最終不得不重做我將對象添加到滾動窗格以避免此問題。具體來說,如果表格將高於視口高度,那麼我只需將表格直接添加到滾動窗格,然後更改我使用中介面板的方式。

感謝大家的意見!

1

只是萬一有人在意,問題在於eclipse啓動器和應用程序的JNLP啓動器有一個不同的KeyboardFocusManager,而JNLP有一些怪癖。

我不知道一個自定義的JLNP側添加的KeyboardFocusManager的,但至少它說明事物。

謝謝大家。