как добавить jtable в jpanel с нулевым макетом?

<p>я хочу добавить <code>jtable</code> в <code>jpanel</code>, макет которого <code>null</code>. <code>jpanel</code> содержит другие компоненты. я должен добавить <code>jtable</code> в нужной позиции.</p>

<h1>пример вложенного/комбинированного макета</h1><p>в учебнике java содержится исчерпывающая информация об использовании менеджеров макетов. см. урок <a href="http://download.oracle.com/javase/tutorial/uiswing/layout/index.html">расположение компонентов в контейнере</a> для получения дополнительной информации.</p><p>один из аспектов макетов, который <em> не </em> хорошо освещен в учебнике, - это вложенные макеты, помещающие один макет внутрь другого, чтобы получить сложные эффекты.</p><p>следующий код помещает различные компоненты в рамку, чтобы продемонстрировать, как использовать вложенные макеты. все явно заданные макеты отображаются в виде заголовка для панели, на которой они используются.</p><p>примечательные аспекты кода:</p><ul> <li>есть поле со списком для изменения plaf (pluggable look and feel) во время выполнения.</li> <li>gui расширяется в соответствии с потребностями пользователя.</li> <li>изображение в нижней части разделенной панели центрируется в области прокрутки.</li> <li>экземпляры меток слева динамически добавляются с помощью кнопки.</li> </ul><h3>нимб плаф</h3><p><img src="https://i.stack.imgur.com/rljph.png" width="681" height="580" title="gui screen shot with nimbus plaf"></p><h2>nestedlayoutexample.java</h2><pre><code>import java.awt.*; import java.awt.image.bufferedimage; import java.awt.event.actionlistener; import java.awt.event.actionevent; import javax.swing.*; import javax.swing.table.defaulttablemodel; import javax.swing.border.titledborder; /** a short example of a nested layout that can change plaf at runtime. the titledborder of each jpanel shows the layouts explicitly set. @author andrew thompson @version 2011-04-12 */ class nestedlayoutexample { public static void main(string[] args) { runnable r = new runnable() { public void run() { final jframe frame = new jframe("nested layout example"); frame.setdefaultcloseoperation(jframe.exit\_on\_close); final jpanel gui = new jpanel(new borderlayout(5,5)); gui.setborder( new titledborder("borderlayout(5,5)") ); //jtoolbar tb = new jtoolbar(); jpanel plafcomponents = new jpanel( new flowlayout(flowlayout.right, 3,3)); plafcomponents.setborder( new titledborder("flowlayout(flowlayout.right, 3,3)") ); final uimanager.lookandfeelinfo[] plafinfos = uimanager.getinstalledlookandfeels(); string[] plafnames = new string[plafinfos.length]; for (int ii=0; ii<plafinfos.length; ii++) { plafnames[ii] = plafinfos[ii].getname(); } final jcombobox plafchooser = new jcombobox(plafnames); plafcomponents.add(plafchooser); final jcheckbox pack = new jcheckbox("pack on plaf change", true); plafcomponents.add(pack); plafchooser.addactionlistener( new actionlistener(){ public void actionperformed(actionevent ae) { int index = plafchooser.getselectedindex(); try { uimanager.setlookandfeel( plafinfos[index].getclassname() ); swingutilities.updatecomponenttreeui(frame); if (pack.isselected()) { frame.pack(); frame.setminimumsize(frame.getsize()); } } catch(exception e) { e.printstacktrace(); } } } ); gui.add(plafcomponents, borderlayout.north); jpanel dynamiclabels = new jpanel(new borderlayout(4,4)); dynamiclabels.setborder( new titledborder("borderlayout(4,4)") ); gui.add(dynamiclabels, borderlayout.west); final jpanel labels = new jpanel(new gridlayout(0,2,3,3)); labels.setborder( new titledborder("gridlayout(0,2,3,3)") ); jbutton addnew = new jbutton("add another label"); dynamiclabels.add( addnew, borderlayout.north ); addnew.addactionlistener( new actionlistener(){ private int labelcount = 0; public void actionperformed(actionevent ae) { labels.add( new jlabel("label " + ++labelcount) ); frame.validate(); } } ); dynamiclabels.add( new jscrollpane(labels), borderlayout.center ); string[] header = {"name", "value"}; string[] a = new string[0]; string[] names = system.getproperties(). stringpropertynames().toarray(a); string[][] data = new string[names.length][2]; for (int ii=0; ii<names.length; ii++) { data[ii][0] = names[ii]; data[ii][1] = system.getproperty(names[ii]); } defaulttablemodel model = new defaulttablemodel(data, header); jtable table = new jtable(model); try { // 1.6+ table.setautocreaterowsorter(true); } catch(exception continuewithnosort) { } jscrollpane tablescroll = new jscrollpane(table); dimension tablepreferred = tablescroll.getpreferredsize(); tablescroll.setpreferredsize( new dimension(tablepreferred.width, tablepreferred.height/3) ); jpanel imagepanel = new jpanel(new gridbaglayout()); imagepanel.setborder( new titledborder("gridbaglayout()") ); bufferedimage bi = new bufferedimage( 200,200,bufferedimage.type\_int\_argb); graphics2d g = bi.creategraphics(); gradientpaint gp = new gradientpaint( 20f,20f,color.red, 180f,180f,color.yellow); g.setpaint(gp); g.fillrect(0,0,200,200); imageicon ii = new imageicon(bi); jlabel imagelabel = new jlabel(ii); imagepanel.add( imagelabel, null ); jsplitpane splitpane = new jsplitpane( jsplitpane.vertical\_split, tablescroll, new jscrollpane(imagepanel)); gui.add( splitpane, borderlayout.center ); frame.setcontentpane(gui); frame.pack(); frame.setlocationrelativeto(null); try { // 1.6+ frame.setlocationbyplatform(true); frame.setminimumsize(frame.getsize()); } catch(throwable ignoreandcontinue) { } frame.setvisible(true); } }; swingutilities.invokelater(r); } } </code></pre><h2>другие скриншоты</h2><h3>windows plaf</h3><p><img src="https://i.stack.imgur.com/fhnci.png" width="681" height="580" title="gui screen shot with windows plaf"></p><h3>mac os x aqua plaf</h3><p><img src="https://i.stack.imgur.com/jaqap.png" width="681" height="580" title="gui screen shot with aqua plaf"></p><h3>ubuntu gtk + plaf</h3><p><img src="https://i.stack.imgur.com/521zz.png" width="681" height="580" title="gui screen shot with gtk+ plaf"></p>

<p>не используйте нулевой макет. научитесь пользоваться layoutmanager:</p><p> <a href="http://download.oracle.com/javase/tutorial/uiswing/layout/using.html">http://download.oracle.com/javase/tutorial/uiswing/layout/using.html</a> </p><p>менеджеры layoutmanager позволяют правильно обрабатывать изменения размера окна или количество динамических компонентов. поначалу они могут показаться пугающими, но они стоят усилий, чтобы учиться.</p>

<p>как я помню, макет <strong>null</strong> означает абсолютную позицию, поэтому вам будет довольно сложно подсчитать точку x для вашего левого верхнего угла jtable. но если вы хотите, чтобы все компоненты панели были по одному, вы можете использовать flowlayout () как</p><pre><code>jpanel panel=new jpanel(new flowlayout()); panel.add(new acomponent()); panel.add(new bcomponent()); panel.add(new jtable()); </code></pre><p>или если вам нужно заполнить панель, вы должны использовать gridlayout () как ...</p><pre><code>int x=2,y=2; jpanel panel=new jpanel(new gridlayout(y,x)); panel.add(new acomponent()); panel.add(new bcomponent()); panel.add(new jtable()); </code></pre><p>удачи</p>

<p>если вы используете нулевой менеджер компоновки, вам всегда нужно устанавливать границы компонента. это проблема в вашем случае.</p><p>вы должны сделать то, что все предлагают здесь, и пойти и использовать некоторый менеджер верстки, чтобы они сэкономили время зайдите и ознакомьтесь с руководством в посте @ jzd.</p><p>наслаждайся, боро.</p>

<p><code>jtable</code> должен быть добавлен в <code>jscrollpane</code>, который фактически должен быть добавлен в <code>jpanel</code>.</p><p>у <code>jpanel</code> должен быть менеджер раскладки.</p><p>если вам не важна точность размера компонентов, вы можете использовать чистое <code>borderlayout</code> и объединить его с <code>flowlayout</code> и <code>gridlayout</code>. если вам нужна точность - используйте jgoodies <code>formlayout</code>.</p><p><code>formlayout</code> действительно хитрый, но вы можете немного поиграть с <code>windowbuilder</code> (который встроен в eclipse) и посмотреть на код, который он генерирует. это может выглядеть сложно, но это просто невежество.</p><p>удачи.</p>

<p>во-первых, вы должны серьезно рассмотреть другие менеджеры макетов, например, borderlayoutmanager (новый jpanel (новый borderlayout ())) - хорошее начало.</p><p>также при разработке вашего диалога помните, что вы можете и должны <strong>вкладывать макеты</strong>: одна jpanel внутри другой jpanel (например, gridlayout внутри borderlayout). обратите внимание: "хороший" диалог должен <strong>правильно изменить размер</strong>, так что если пользователь изменяет размер вашего фрейма, вы хотите автоматически расширять ваши информационные объекты, такие как таблица, и не показывать большие области фона jpanel. это то, чего вы не можете достичь с помощью nulllayout.</p><p>но, возможно, есть случаи - где-то в этом большом мире - когда nulllayout - это как раз то, что нужно. итак, вот пример:</p><pre><code>import java.awt.dimension; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.table.defaulttablemodel; public class jtableinnulllayout { public static void main(string[] argv) throws exception { defaulttablemodel model = new defaulttablemodel( new string[][] { { "a", "123"} , {"b", "456"} }, new string[] { "name", "value" } ); jtable t = new jtable(model); jpanel panel = new jpanel(null); jscrollpane scroll = new jscrollpane(t); scroll.setbounds( 0, 20, 150, 100 ); // x, y, width, height panel.add(scroll); jframe frame = new jframe(); frame.add(panel); frame.setpreferredsize( new dimension(200,200)); frame.pack(); frame.setvisible(true); } } </code></pre>

<p>когда у компонента есть "нулевой" макет, вы должны сами управлять макетом, это означает, что вы должны вычислить размеры и местоположения дочерних элементов компонента, чтобы решить, где они будут нарисованы. довольно утомительно, если в этом нет необходимости.</p><p>если вы действительно хотите этот детализированный элемент управления, возможно, сначала попробуйте gridbaglayout, прежде чем переходить к пользовательскому интерфейсу.</p>

<pre><code>this.settitle("sample"); jpanel p = new jpanel(new borderlayout()); windowevent we = new windowevent(this, windowevent.window\_closed); this.addwindowlistener(new windowadapter() { public void windowclosing(windowevent we) { system.exit(0); } }); // create columns names string columnnames[] = { "firstcol", "secondcol", "thirdcol", "fourthcol" }; datamodel = new defaulttablemodel(); for (int col = 0; col < columnnames.length; col++) { datamodel.addcolumn(columnnames[col]); } // create a new table instance table = new jtable(datamodel); table.setpreferredscrollableviewportsize(new dimension(200, 120)); table.setfillsviewportheight(true); table.setshowgrid(true); table.setautoscrolls(true); // add the table to a scrolling pane scrollpane = new jscrollpane(table, jscrollpane.vertical\_scrollbar\_as\_needed, jscrollpane.horizontal\_scrollbar\_as\_needed); scrollpane.setpreferredsize(new dimension(700, 700)); jpanel jpresultpanel = new jpanel(); jpresultpanel.setborder(borderfactory.createtitledborder( borderfactory.createetchedborder(), "result", titledborder.center, titledborder.top)); jpresultpanel.add(scrollpane); add(jpresultpanel); pack(); setsize(720, 720); setvisible(true); </code></pre><p>попробуй это.</p>

<pre><code>jframe frame = new jframe("sample frame"); frame.setsize(600, 600); frame.setdefaultcloseoperation(jframe.exit\_on\_close); jpanel panel = new jpanel(); defaulttablemodel dfm = new defaulttablemodel(data, columnnames); jtable table = new jtable(dfm); jscrollpane scrollpane = new jscrollpane(table); panel.add(scrollpane); frame.add(panel); frame.setvisible(true); </code></pre><p>модель стола зависит от ваших требований</p>

<pre><code>jpanel panel = new jpanel(); jtable table = new jtable(rowdata, coldata); jscrollpane scrollpane = new jscrollpane(table); panel.add(scrollpane, borderlayout.center); panel.setsize(800, 150); panel.add(table); panel.setlocationrelativeto(null); panel.setvisible(true); </code></pre><p>надеюсь это поможет.</p>

<p>вы можете использовать следующий код. чтобы добавить jtable в jpanel.</p><pre><code>jpanel panel = new jpanel(); this.setcontentpane(panel); panel.setlayout(null); string data[][] = {{"1.", "abc"}, {"2.", "def"}, {"3.", "ghi" }}; string col[] = {"sr. no", "name"}; jtable table = new jtable(data,col); table.setbounds(100, 100, 100, 80); panel.add(table); setvisible(true); setsize(300,300); </code></pre>