0

私はswingsに少し慣れていません、そして私はJtableを含むいくつかのコードを咳き込もうとしていました。スクロールバーポリシーを追加しても、垂直スクロールバーが表示されないようです。コードはかなりぼろぼろです(事前に警告します)。ただし、スクロールバーポリシーのどこに配置する必要があるかを教えてください。いろいろなところに追加してみましたが、表示されないようです。

もう1つの質問は、空のテーブルを作成する方法です。プロセスボタンがクリックされるたびに、テーブルを更新したいと思います。私もこの方向に向けてもらえますか。

使用方法:通常のノードのテキストフィールドに5や10などの数字を入力し、プロセスボタンをクリックするだけです。

私のコード:

package ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

import utils.ThroughputUtility;

/**
 * @author Nathan
 *
 */
public class EntryPoint extends JPanel{
    public boolean isProcesed =false;
    static JFrame frame;

     JTabbedPane jTabbedPane = new JTabbedPane();

    private static final long serialVersionUID = -6490905886388876629L;
    public String messageTobeSent = null;
    public int regularNodeCount =0;

    public static final String MESSAGE_TO_BE_SENT ="  Please Enter the message to be sent. ";

    protected static final String ONE = "1";

    Map<String,Double> regNodeThroughputMap ;
    static JTable tableOfValues;

    Object columnNames[] = { "<html><b>Regular Node Name</b></htm>", "<html><b>Throughput Value Obtained</b></html>"};

    Object rowData[][] = null;
    public EntryPoint() {



        jTabbedPane.setTabPlacement(JTabbedPane.NORTH);
        Font font = new Font("Verdana", Font.BOLD, 12);
        jTabbedPane.setFont(font);

        //Server Side Panel.
         JPanel serverPanel = getServerPanel();       
         jTabbedPane.addTab("Server", serverPanel);

         //Client side Panel.
         JPanel clientPanel = getClientPanel();       
         jTabbedPane.addTab("Client", clientPanel);

    }

    private JPanel getClientPanel() {
        //Heading Label
        JPanel clientPanel = new JPanel();
        JLabel RegularNodeLabel =  new JLabel("<html><u>Throughput Optimization For Mobile BackBone Networks</u></html>");
        RegularNodeLabel.setFont(new Font("Algerian",Font.BOLD,20));
        RegularNodeLabel.setForeground(new Color(176,23,31));

        clientPanel.add(RegularNodeLabel);

        return clientPanel;
    }

    /**Server Side Code
     * @return
     */
    private JPanel getServerPanel() {

        //Heading Label
        JPanel serverPanel = new JPanel(new FlowLayout());
        final Box verticalBox1 = Box.createVerticalBox();
        Box horozontalBox1 = Box.createHorizontalBox();
        Box verticalBox2forsep = Box.createVerticalBox();
        Box horozontalBox2 = Box.createHorizontalBox();


        JPanel heading = new JPanel(new FlowLayout(FlowLayout.CENTER));

        JLabel backBoneNodeLabel =  new JLabel("<html><u>Throughput Optimization For Mobile BackBone Networks</u></html>");
        backBoneNodeLabel.setFont(new Font("Algerian",Font.BOLD,20));
        backBoneNodeLabel.setForeground(new Color(176,23,31));
        backBoneNodeLabel.setAlignmentX(Component.CENTER_ALIGNMENT);

        //Indication of BackBone Node
        JPanel body = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JLabel backBoneNodeID =  new JLabel("Fixed BackBone Node");
        backBoneNodeID.setFont(new Font("Algerian",Font.BOLD,16));
        backBoneNodeID.setForeground(new Color(176,23,31));
        backBoneNodeID.setAlignmentX(Component.CENTER_ALIGNMENT);

        //Seperator
        JLabel seperator =  new JLabel("     ");
        seperator.setFont(new Font("Algerian",Font.BOLD,20));
        seperator.setForeground(new Color(176,23,31));
        verticalBox2forsep.add(seperator);

        //Message label
        JLabel messageLabel = new JLabel("Please enter the Message to be sent:  ");
        messageLabel.setFont(new Font("Algerian",Font.BOLD,16));
        messageLabel.setForeground(new Color(176,23,31));
        messageLabel.setAlignmentX(Component.LEFT_ALIGNMENT);

        //Message Text
        final JTextField messageText = new JTextField(MESSAGE_TO_BE_SENT,25);
        messageText.addFocusListener(new FocusListener() {

            @Override
            public void focusLost(FocusEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void focusGained(FocusEvent arg0) {
                if(messageText.getText().trim().equalsIgnoreCase(MESSAGE_TO_BE_SENT.trim())){
                    messageText.setText("");
                }

            }
        });


        horozontalBox1.add(messageLabel);
        horozontalBox1.add(messageText);

        //Regular node attached to backbone nodes.
        JLabel regularNodelabel = new JLabel("Number of Regular nodes to be attached to the backbone node. ");
        regularNodelabel.setFont(new Font("Algerian",Font.BOLD,16));
        regularNodelabel.setForeground(new Color(176,23,31));
        regularNodelabel.setAlignmentX(Component.LEFT_ALIGNMENT);

        //Regular Node text
        final JTextField regularNodeText = new JTextField(ONE,5);
        regularNodeText.addFocusListener(new FocusListener() {

            @Override
            public void focusLost(FocusEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void focusGained(FocusEvent e) {
                if(regularNodeText.getText().trim().equalsIgnoreCase(ONE.trim())){
                    regularNodeText.setText("");
                    tableOfValues = new JTable(0,0);

                }


            }
        });

        horozontalBox2.add(regularNodelabel);
        horozontalBox2.add(regularNodeText);

        //Button for Processing. 
        JButton processbutton = new JButton("Process");
        processbutton.setFont(new Font("Algerian",Font.BOLD,16));
        processbutton.setForeground(new Color(176,23,31));
        processbutton.setAlignmentX(Component.CENTER_ALIGNMENT);

        //Processing on clciking process button
        processbutton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                isProcesed=false;
                Runnable runThread = new Runnable() {

                    @Override
                    public void run() {
                        while(!isProcesed){
                            try {
                                Thread.sleep(50);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        verticalBox1.add(tableOfValues);
                        isProcesed =false;

                    }
                };
                Thread processThread= new Thread(runThread);
                processThread.start();


                regularNodeCount = Integer.parseInt(regularNodeText.getText().trim());
                regNodeThroughputMap = getThroughPutValues(regularNodeText.getText().trim());
                System.out.println("Map obtained = "+regNodeThroughputMap);
                tableOfValues = populateTable(regNodeThroughputMap);
                isProcesed=true;
                JScrollPane scrollPane = new JScrollPane(tableOfValues);
                scrollPane.add(tableOfValues);
                scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                verticalBox1.add(scrollPane,BorderLayout.CENTER);
               // verticalBox1.add(scrollPane);


            }
        });

        verticalBox1.add(backBoneNodeID);
        verticalBox1.add(verticalBox2forsep);
        verticalBox1.add(horozontalBox1);
        verticalBox1.add(verticalBox2forsep);
        verticalBox1.add(horozontalBox2);
        verticalBox1.add(verticalBox2forsep);
        verticalBox1.add(processbutton);



        heading.add(backBoneNodeLabel);
        //body.add(backBoneNodeID);
        body.add(verticalBox1);

        serverPanel.add(heading);
        serverPanel.add(body);

        return serverPanel;
    }

    protected JTable populateTable(Map<String,Double> regNodeThroughputMap) {

        /*{ { "Row1-Column1", "Row1-Column2", "Row1-Column3" },
            { "Row2-Column1", "Row2-Column2", "Row2-Column3" } }*/
        rowData = new Object[regularNodeCount+1][2];

         Set<Map.Entry<String, Double>> set = regNodeThroughputMap.entrySet();

         for (Map.Entry<String, Double> me : set) {
             System.out.println("key ="+me.getKey());
             System.out.println("Value ="+me.getValue());
         }

         String[] keys = new String[regularNodeCount+2];
         String[] values = new String[regularNodeCount+2];

         List<String> keyList = new LinkedList<String>();
         List<String> valueList = new LinkedList<String>();
         keyList.add("");
         valueList.add("");

         for(String key:regNodeThroughputMap.keySet()){
             keyList.add(key);
         }

         for(double value:regNodeThroughputMap.values()){
             System.out.println(value);
             valueList.add(Double.toString(value));
         }

         keyList.toArray(keys);
         valueList.toArray(values);

         System.out.println(Arrays.asList(keys));
         System.out.println(Arrays.asList(values));
         rowData[0][0] =columnNames[0];
         rowData[0][1] =columnNames[1];

         for(int i=1;i<=regularNodeCount;i++){
             for(int j=0;j<2;j++){
                 if(j==0)
                     rowData[i][j]=keys[i];
                 if(j==1)
                     rowData[i][j]=values[i];
             }
         }


        return new JTable(rowData, columnNames); 


            //Printing the array
    /*      for (int i =0; i < regularNodeCount; i++) {
                for (int j = 0; j < 2; j++) {
                System.out.print(" " + rowData[i][j]);
                }
                System.out.println("");
                }
*/


    }

    protected Map<String, Double> getThroughPutValues(String regularNodeInput) {
        return ThroughputUtility.generateMapofNodeAndThroughput(regularNodeInput);
    }

    protected static void createAndShowGUI() {
         //Create and set up the window.
        frame = new JFrame("Throughput Optimization for Mobile BackBone Networks");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        EntryPoint splitPaneDemo = new EntryPoint();
        frame.getContentPane().add(splitPaneDemo.jTabbedPane);

        JScrollPane sp = new JScrollPane(tableOfValues);
        sp.setBorder(BorderFactory.createEmptyBorder());
        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        sp.setHorizontalScrollBarPolicy(JScrollPane .HORIZONTAL_SCROLLBAR_AS_NEEDED);
        frame.setResizable(false);
        //Display the window.
        frame.pack();
        frame.setVisible(true);
        frame.setSize(800,600);




    }


    public static void main(String[] args) {

         try {
                for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (UnsupportedLookAndFeelException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

          javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });

    }



}

ThroughputUtility.javaの追加

package utils;

import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @author Nathan
 *
 */
public class ThroughputUtility {

    public static double MIN =5000;
    public static double MAX =10000;
    public static final double e =Math.E;
    public static final double epsilon = 8.854187 *Math.pow(10,-12); 

    static int regularNodeCount;
    static int counter ;

    /**Generates the map of Node and ThroughPut values
     * @param regularNodeInput
     */
    public static Map<String,Double> generateMapofNodeAndThroughput(String regularNodeInput){
        regularNodeCount = Integer.parseInt(regularNodeInput);
        List<Double> randNodeDistances  =getRandDistanceOfNodes(regularNodeCount);

        Map<String,Double> nodeAndThroughputmap = getThroughputValuesForNodes(randNodeDistances);
        System.out.println(nodeAndThroughputmap);
        return nodeAndThroughputmap;

    }

    /** Obtains the throughput value based on the distances between
     * the regular nodes and the backend Nodes.
     * @param randNodeDistances
     * @return
     */
    private static Map<String, Double> getThroughputValuesForNodes(
            List<Double> randNodeDistances) {
        Map<String,Double> nodeAndThroughputmap = new LinkedHashMap<String, Double>();

        for(double i : randNodeDistances){
            double throughputValue = calculateThroughPut(i);
            nodeAndThroughputmap.put("RegularNode :"+counter, throughputValue);
            counter++;
        }

        return nodeAndThroughputmap;
    }

    private static double calculateThroughPut(double distanceij) {

        double throughput  = 1 /(e*regularNodeCount*distanceij*epsilon);

        return throughput;
    }

    /**Generates the distance dij .
     * @param regularNodeCount
     * @return
     */
    private static List<Double> getRandDistanceOfNodes(int regularNodeCount) {
        List<Double> distnodeNumbers = new LinkedList<Double>();

        for(int i=0;i<regularNodeCount;i++){
            double randnodeNumber = MIN + (double)(Math.random() * ((MAX - MIN) + 1));
            distnodeNumbers.add(randnodeNumber);

        }
        return distnodeNumbers;
    }

    public static void main(String[] args) {
        ThroughputUtility.generateMapofNodeAndThroughput("5");
        /*System.out.println(e);
        System.out.println(epsilon);*/
    }
}
4

3 に答える 3

3
  1. クイックルックでわかる限り、JFrameへのスクロールペインにアクセスすることはありません。
  2. TableModelのデータを変更します(またはJTableのTableModelを置き換えます)

http://docs.oracle.com/javase/tutorial/uiswing/components/table.htmlを参照してください

于 2012-04-27T15:04:25.153 に答える
3

スクロールバーが表示されない主な問題は、テーブルを複数のコンテナに追加することです。

ボタンをクリックすると、多くのスイングオブジェクトが再作成され(なぜ?)、スレッドを開始してテーブルをボックスに追加します(なぜ??何をしているのかわからない場合は、スイングとマルチスレッドに注意してください)。 。その後(またはスレッドの実行時間によっては前に)、テーブルをスクロールペインに追加します。

スクロールペインにはテーブルが含まれていません。これは、一度しか使用できないためです。

簡単な修正は次のようになります。GUIのものをすべて一度作成し、アクションリスナーなどから除外します。アプリケーションを起動すると、空のテーブルが表示されるはずです。同じオブジェクトを複数のコンテナに追加しないでください。を使用して、テーブルとスクロールペインのサイズを制御できます。

table.setPreferredSize(new Dimension(width, height));

(アクションリスナーにある)ボタンをクリックすると、すべての新しいデータを取得してテーブルに追加します。たとえば、このようなものを使用します。

tableOfValues.getModel().setValueAt(value, row, column);

または、次の必要がある場合は、新しいテーブルモデルを作成します。

tableOfValues.setModel(new DefaultTableModel(rowData, columnNames));

今のところ、コードを見て言えることはこれだけです...

編集:メソッドpopulateTable(...)で新しいテーブルを作成しないでください!必要に応じて、上記のコードを使用して新しいモデルを設定するか、既存のモデルを使用してその値を変更してください。

于 2012-04-27T15:26:37.467 に答える
2

同じ問題が発生しました。JTablepreferredsizeをnullに設定すると、スクロールバーが表示されます。

それが役に立てば幸い

于 2015-04-07T13:47:53.623 に答える