سؤال

ولدي وظيفة التي تحصل على مفتاح من المستخدم ويقوم بإنشاء جدول هاش (على نمط محدد من قبل مفتاح). بعد إنشاء جدول هاش، وأود أن تعبئة JTable بحيث يمثل كل كل عمود مفتاح وكل الصفوف يمثل القيم المرتبطة المفتاح. حاولت كل شيء ولكن لا يمكن الحصول على هذا العمل. أنا لا إنشاء الجدول من داخل منشئ وأنا في حاجة للحصول على مدخلات من المستخدم.

هل كانت مفيدة؟

المحلول

كيفية استخدام الجداول: إنشاء جدول نموذج .

<اقتباس فقرة>   

ومنشئ JTable المستخدمة من قبل   SimpleTableDemo يخلق الجدول الخاص به   نموذج مع رمز مثل هذا:

new AbstractTableModel() {
    public String getColumnName(int col) {
        return columnNames[col].toString();
    }
    public int getRowCount() { return rowData.length; }
    public int getColumnCount() { return columnNames.length; }
    public Object getValueAt(int row, int col) {
        return rowData[row][col];
    }
    public boolean isCellEditable(int row, int col)
        { return true; }
    public void setValueAt(Object value, int row, int col) {
        rowData[row][col] = value;
        fireTableCellUpdated(row, col);
    }
}

وأساسا لديك للالتفاف جدول هاش الخاصة بك بالطريقة المذكورة أعلاه. وهنا مثال على ذلك.

package eed3si9n.hashtabletable;

import java.awt.BorderLayout;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.JButton;
import java.awt.Dimension;

public class MainForm extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;  //  @jve:decl-index=0:visual-constraint="23,38"
    private JScrollPane m_scrollPane = null;
    private JTable m_table = null;
    private Hashtable<String, String> m_hash = null;
    private JButton m_btnAdd = null;    

    /**
     * This is the default constructor
     */
    public MainForm() {
        super();
        initialize();
        m_hash = new Hashtable<String, String>();
        m_hash.put("Dog", "Bow");
    }

    private void onButtonPressed() {
        m_hash.put("Cow", "Moo");
        m_table.revalidate();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(409, 290);
        this.setTitle("JFrame");
        this.setContentPane(getJContentPane());
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.setSize(new Dimension(500, 500));
            jContentPane.setPreferredSize(new Dimension(500, 500));
            jContentPane.add(getM_scrollPane(), BorderLayout.NORTH);
            jContentPane.add(getM_btnAdd(), BorderLayout.SOUTH);
        }
        return jContentPane;
    }

    /**
     * This method initializes m_scrollPane 
     *  
     * @return javax.swing.JScrollPane  
     */
    private JScrollPane getM_scrollPane() {
        if (m_scrollPane == null) {
            m_scrollPane = new JScrollPane();
            m_scrollPane.setViewportView(getM_table());
        }
        return m_scrollPane;
    }

    /**
     * This method initializes m_table  
     *  
     * @return javax.swing.JTable   
     */
    private JTable getM_table() {
        if (m_table == null) {
            m_table = new JTable();
            m_table.setModel(new AbstractTableModel(){
    private static final long serialVersionUID = 1L;

    public int getColumnCount() {
        return 2;
    }

    public int getRowCount() {
        return m_hash.size();
    }

    public String getColumnName(int column) {
        if (column == 0) {
            return "Animal";
        } else {
            return "Sound";
        }
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        if (columnIndex == 0) {
            return getKey(rowIndex);
        } else {
            return m_hash.get(getKey(rowIndex));
        } // if-else

    }

    private String getKey(int a_index) {
        String retval = "";
        Enumeration<String> e = m_hash.keys();
        for (int i = 0; i < a_index + 1; i++) {
            retval = e.nextElement();
        } // for

        return retval;
    }

            });
        }
        return m_table;
    }

    /**
     * This method initializes m_btnAdd 
     *  
     * @return javax.swing.JButton  
     */
    private JButton getM_btnAdd() {
        if (m_btnAdd == null) {
            m_btnAdd = new JButton();
            m_btnAdd.setPreferredSize(new Dimension(34, 30));
            m_btnAdd.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    onButtonPressed();
                }
            });
        }
        return m_btnAdd;
    }

    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() {
                MainForm frame = new MainForm();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(500, 500);
                frame.setVisible(true);
            }
        });
    }
}  //  @jve:decl-index=0:visual-constraint="10,10"

نصائح أخرى

أولا، تجنب Hashtable، تذهب مباشرة لMap. في هذه الحالة هناك اثنين من تطبيقات معايير المحتملة التي تريد ميتس: LinkedHashMap يمكن الاحتفاظ الترتيب الذي الإدخالات أضيفت. TreeMap، وSortedMap / NavigableMap، وفرز النتائج (ترتيب والذي يمكن تحديده من قبل Comparator. بدلا من ذلك قد ترغب شكل من أشكال Map أن الأحداث النار أو كما يوفر TableModel.

إذا كنت ترغب في تحويل مرة واحدة من Map إلى الجدول، ثم انها واضحة جدا.

public static TableModel toTableModel(Map<?,?> map) {
    DefaultTableModel model = new DefaultTableModel(
        new Object[] { "Key", "Value" }, 0
    );
    for (Map.Entry<?,?> entry : map) {
        model.addRow(new Object[] { entry.getKey(), entry.getValue() });
    }
    return model;
}

وبعد ذلك فقط خلق JTable مع هذا النموذج بالسكان مسبقا.

و(تنويه: لقد لم تختبر أو نحو ذلك بقدر جمعت هذا الرمز)

لإبقاء Map وTableModel متزامنة هو رمز أكثر. عموما فإنه من الأفضل تجنب تكرار الدولة أينما أمكن ذلك. كتابة فئة أن يعرض نفسه على حد سواء Map وTableModel. هل يمكن أن تذهب أكثر منفصلتين من خلال وجود Map الذي وقع الأحداث وTableModel أن تتكيف مع Map (على الرغم علما بأن Map لا يكون الوصول العشوائي على أساس مؤشر، لذلك عليك أن تكون ذكية iether أو بطيئة للخرائط كبيرة).

والذهاب في الاتجاه الآخر، واتباع نهج أكثر بساطة سيكون لإضافة البيانات مباشرة إلى DefaultTableModel وليس باستخدام Map على الإطلاق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top