Оформление на Java Swing за таблица с възможност за превъртане?

В момента имам JPanel вътре в JPanel, където бих искал да поставя своя JScrollPane/JTable. Имам проблеми с поставянето му там, където искам. Бих искал таблицата да пасва на цялата ширина на JPanel, но да запълва само толкова място, колкото е необходимо, за да покаже всички динамични данни в таблицата вертикално.

Това е кодът, който имам в момента и снимката е как изглежда. Синята област е вложеният панел за ситуацията с таблица/превъртане. Също така защо има глупава сива кутия под масата. Как да се отърва от това? Съжалявам за снимката, данните са чувствителни. Благодаря.

    JPanel panel = new JPanel();
    panel.setBounds(50, 100, 300, 450);
    panel.setBackground(Color.blue);
    contentPane.add(panel); //contentPane is the outter panel

    JScrollPane scrollpane = new JScrollPane(table); //table was created earlier
    panel.add(scrollpane,BorderLayout.NORTH);

панел на маса

Примерна програма (не искам този голям правоъгълник под масата)

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class Test {

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(350,100,1000,800);
    JPanel contentPane = new JPanel(new BorderLayout());
    frame.setContentPane(contentPane);
    JTable table = new JTable(5,5);
    JScrollPane scrollpane = new JScrollPane(table);
    table.setFillsViewportHeight(true);
    contentPane.add(scrollpane,BorderLayout.NORTH);
    frame.revalidate();
}

}

person zProgrammer    schedule 12.11.2013    source източник
comment
Виждам setBounds, което ме кара да мисля, че използвате нулево оформление...   -  person MadProgrammer    schedule 13.11.2013
comment
Използвам абсолютно позициониране за външния панел. Не виждам защо това би имало значение.   -  person zProgrammer    schedule 13.11.2013
comment
@MadProgrammer, неговият код също не ни казва оформлението на JPanel екземпляр panel, но той добавя компонент с BorderLayout ограничение :)   -  person Sage    schedule 13.11.2013


Отговори (2)


Също защо има глупава сива кутия под масата. Как да се отърва от това?

Опитайте да използвате table.setFillsViewportHeight(true);< /strong> след като го добавите към JSCrollPane: както правите сега:

   JPanel panel = new JPanel();
   // other code
   panel.setLayout(new BorderLayout()); // not sure whither you are already doing this

   JScrollPane scrollPane = new JScrollPane(table);
   table.setFillsViewportHeight(true);

   panel.add(scrollPane, BorderLayout.CENTER);

извикване на функцията setFillsViewportHeight(true) задайте свойството fillsViewportHeight. Когато това свойство е true, table използва цялата височина на контейнера, дори ако table няма достатъчно редове, за да използва цялото вертикално пространство.

Забележка:

  1. Не виждам да сте добавили оформление към panel, към което сте добавили JScrollPane. Надявам се, че знаете, че JPanel използва FlowLayout като оформление по подразбиране, което се подчинява на съвета за предпочитан размер на компонента. Отново panel.add(scrollpane, BorderLayout.NORTH); създава неяснота. Тъй като използваме ограничение: BorderLayout.NORTH към компонента, който има BorderLayout като мениджър на оформлението.

  2. Панелът със съдържание на Frame има BorderLayout като мениджър на оформлението по подразбиране. Вие сте обвързани с panel, като използвате setBounds(), което обикновено правим, докато работим с AbsoluteLayout(null) оформление. И AbsoluteLayout не става, докато разработвате приложение в Swing

person Sage    schedule 12.11.2013
comment
JPanel все още използва FlowLayout, което означава, че екранът за превъртане може да не запълни цялата област... - person MadProgrammer; 13.11.2013
comment
@MadProgrammer, отбелязах проблема. Наистина е двусмислено: когато го прави, panel.add(scrollpane, BorderLayout.NORTH); - person Sage; 13.11.2013
comment
Все пак не бих искал масата да запълни целия контейнер. Просто искам да е толкова голям, колкото е необходимо, за да видите всички данни и ако е по-голям от контейнера, трябва да запълни цялото нещо с лентата за превъртане. - person zProgrammer; 13.11.2013
comment
@Робърт, Get some people skills and grow up - Мисля, че ти си този, който се нуждае от умения за работа с хора. Вие сте този, който моли за помощ и след това прави коментари, когато хората се опитват да помогнат. Изключително трудно е да ви дам точен съвет заради такъв лош въпрос. Кодът, който публикувахте, е почти безполезен. Твърдението, че не работи, не ни дава никаква информация. Публикувайте вашите SSCCE предавания какво сте опитали въз основа на всички предложения, които сте получили. - person camickr; 13.11.2013
comment
@camickr, модераторът е премахнал коментарите, както изглежда. Отбелязах коментарите му. Да се ​​надяваме, че ще публикува SSCCE, за да ни уведоми какво точно се опитва да направи. - person Sage; 13.11.2013
comment
Съжалявам момчета, ще се опитам да направя един. - person zProgrammer; 13.11.2013
comment
Добавих кратка програма. Методът, който ме накарахте да извикам, само променя големия правоъгълник под масата от сив на бял. - person zProgrammer; 13.11.2013

но запълва само толкова място, колкото е необходимо, за да покаже всички динамични данни в таблицата вертикално.

Какво ще стане, ако имате 100 реда, те няма да могат да се показват на рамката едновременно?

Заменете метода getPreferredScrollableViewportSize() на JTable, за да върнете разумно число, това число трябва да включва височината на JTableHeader. Така че вероятно бихте искали да ограничите височината до разумен брой редове + заглавката на таблицата.

panel.add(scrollpane,BorderLayout.NORTH);

Ограничението NORTH не прави нищо. JPanel използва FlowLayout по подразбиране. Ще трябва да зададете оформлението на панела на BorderLayout.

Редактиране:

Бяхте помолени да покажете своя SSCCE, който включва предложението, направено в тези отговори. Не си:

  1. имплементира метода getPreferredScrollableViewportSize().
  2. направи pack() на рамката, след като добави всички компоненти към рамката.

Други общи коментари.

  1. Не посочвайте размер на рамката. За това служи методът pack(). Дори и да го направихте, не бихте кодирали размер. Мониторът ми дори не е достатъчно голям, за да покаже рамка с размера, който сте посочили.

  2. Не правете рамката видима, докато не добавите всички компоненти към рамката.

  3. GUI трябва да бъде създаден в нишката за изпращане на събития.

person camickr    schedule 12.11.2013
comment
Ако има 100 реда, тогава той трябва да запълни цялото пространство вертикално със скрола (следователно точката на скролпана). - person zProgrammer; 13.11.2013
comment
Това не е начинът, по който работят мениджърите на оформлението. Компонент предлага подсказки, които мениджърът на оформлението да използва. Така че панелът не може да каже, че имам нужда от 500 пиксела височина, защото може да има друг панел в рамката, който също се нуждае от 500 пиксела височина, което би било твърде много за рамката. Така че всеки компонент трябва да има предпочитан размер. След това опаковате рамката и използвате мениджъри на оформление, които позволяват на компонента да расте/свива и размерът на рамката да се променя, което означава, че НЕ трябва да добавяте вашия компонент към СЕВЕР, защото if никога няма да промени височината, дори ако има повече място. - person camickr; 13.11.2013
comment
И така, какво оформление препоръчвате за управление на това? Просто не съм сигурен как го карате да променя размера в рамките на панел. - person zProgrammer; 13.11.2013
comment

Ако използвате Ext JS 3 и искате да добавите подсказка върху областта за въвеждане на вашето поле (не върху етикета), опитайте следното:

comp = new Ext.form.TextField({...});

var tooltipText = 'Enter your name';

Ext.QuickTips.init();

Ext.QuickTips.register({
    target: comp,
    title: '',
    width: 250,
    text: tooltipText
});
- person camickr; 13.11.2013
comment
Добавих кратка програма. Докато върви, бих искал този голям правоъгълник под масата да го няма. Искам таблицата да показва само клетките. И в този пример задавам броя на колоните и редовете, но в действителната ми програма редовете, по-специално, се променят в зависимост от критериите, така че трябва да може да преоразмерява динамично. - person zProgrammer; 13.11.2013
comment
Все още не знам защо бих задал предпочитан размер за него. Никога не трябва да има определен размер за масата. Просто не трябва да надвишава площта на панела. Не разбирам защо ограничаването на размера на таблицата ще направи нещо. Не искам определен размер за масата. Също така методът pack() не беше споменат нито веднъж в тази тема, така че макар да оценявам предложението, не се дръжте така, сякаш не съм запознат с него. Моля, прочетете въпроса ми и дайте полезна информация, вместо да се оплаквате, че не правя неща, които не са подходящи за това, което искам. - person zProgrammer; 15.11.2013
comment

Благодаря ви за предложението, Sridhar, започнах да търся начини за премахване на JSON в GSP и намерих отговора тук:

как да- render-json-properly-without-escaping-quotes-inside-a-gsp-script-tag

Трябва да използвам маркера g:applyCodec в моя GSP:

<g:applyCodec encodeAs="none">
     $scope.gridOptions = ${grid};
</g:applyCodec>
- person camickr; 15.11.2013
comment
@Робърт Also the method pack() was not mentioned once in this thread - seriously. Наистина трябва да прочетете, преди да коментирате. Please read my question - Сега е ваш ред да прочетете отговора ми. Положих искрени усилия да разбера вашето изискване и направих това, което смятам за подходящо. От вас зависи да положите усилия, за да приложите предложението ми, тъй като кодът, който сте публикували, не показва никакви усилия, така че вече не съм сигурен как да помогна. - person camickr; 15.11.2013