تغيير حجم مكون التأرجح عند تغير المحتوى ديناميكيًا

StackOverflow https://stackoverflow.com/questions/3615573

  •  26-09-2019
  •  | 
  •  

سؤال

لدي نفس المشكلة مع مكونين JTextfield و JCombobox ، أفترض أن الحل الذي أبحث عنه سيحلها لجميع المكونات.

لقد قمت بتعيين حجم المكونات على الافتراضي وبالتالي حجمها يناسب المحتوى الأولي الذي قدمته له. عندما أقوم بتغيير محتوى المكون لتجاوز منطقة المكون ، لا يمكنني رؤية النص بأكمله ، وأود أن يتم تغيير حجم المكون الخاص بي لتناسب النص.

كيف يمكنني إنجاز ذلك؟

تحديث:

قامت الحزمة () على الإطار بتوسيع حقل النص فقط ، كيف يمكنني فعل الشيء نفسه وتوسيع مربع التحرير والسرد؟

تحديث:

    private class ComboBoxRenderer extends JLabel implements ListCellRenderer {
    private static final long serialVersionUID = 752379460716217273L;
    Dimension maxSize=new Dimension();
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        setText(value.toString());
        Dimension size = getPreferredSize();
        if(maxSize.width<size.width)
            maxSize.width=size.width;
        if(maxSize.height<size.height)
            maxSize.height=size.height;

        resolutionDescriptor_ComboBox.setPreferredSize(maxSize);
        return this;
    }

}

هذا يعمل ، غير فعال للغاية ، ولكنه خطوة أولى ، الشيء هو أنه لا يأخذ صورة الزر إلى اعتبارات الحجم ، لذلك لا يزال بعض النص غير معروض ، ولكن تم تغيير حجم المكون ، هل لديك أي اقتراحات؟

آدم.

إجابه:

هذا فعل الخدعة مع حزمة () ، لا حاجة إلى إعادة تحديد.

    private class ComboBoxRenderer extends JLabel implements ListCellRenderer {
    private static final long serialVersionUID = 752379460716217273L;
    Dimension maxSize=new Dimension();
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        setText(value.toString());
        Dimension size = getPreferredSize();
        if(maxSize.width<size.width) {
            maxSize.width=size.width;
            resolutionDescriptor_ComboBox.setPrototypeDisplayValue(value.toString());
        }
        if(maxSize.height<size.height)
            maxSize.height=size.height;

        return this;
    }

}

تأكد من تصميم شيء أكثر كفاءة ثم هذا ...

تحديث:

وليس هناك حاجة للحزمة ()!

آدم.

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

المحلول

JComboBox لديها setPrototypeDisplayValue(Object) الطريقة التي يتم استخدامها لحساب العرض المفضل للمكون بناءً على طول المعلمة. جرب ذلك.

وبدلا من pack() استعمال doLayout() جنبا إلى جنب مع بعض revalidate() أو repaint()

نصائح أخرى

قم بعمل حزمة () على الإطار

لتغيير حجم مربع التحرير والسرد يمكنك تجربته:

comboBox.setModel( comboBox.getModel() );

أعتقد أن هذا يجب أن يتسبب في إعادة حساب الحجم المفضل لصندوق التحرير والسرد. بالطبع ستحتاج بعد ذلك إلى القيام بالحزمة () مرة أخرى.

تعديل:

تمت إضافة SSCCE بسيط يوضح هذا يعمل:

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

public class ComboBoxTest3 extends JFrame implements ActionListener
{
    JComboBox comboBox;
    JTextField textField;

    public ComboBoxTest3()
    {
        String[] tabs = {"one", "two", "three", "four", "five", "six", "seven" };
        DefaultComboBoxModel model = new DefaultComboBoxModel(tabs);
        comboBox = new JComboBox( model );

        textField = new JTextField("hello");

        add(comboBox, BorderLayout.WEST );
        add(textField, BorderLayout.EAST );

        JButton button = new JButton("Pack");
        button.addActionListener( this );
        add(button, BorderLayout.SOUTH);
    }

    public void actionPerformed(ActionEvent e)
    {
        textField.setText("hello there!");
        comboBox.addItem("some longer text");
        comboBox.setModel( comboBox.getModel() );
        pack();
    }

    public static void main(String[] args)
    {
        JFrame frame = new ComboBoxTest3();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
     }

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