জাভা জেটিবেল কলাম প্রস্থকে সেট করছে


95

আমার একটি জেটিবেল রয়েছে যাতে আমি কলামের আকারটি নীচে সেট করেছি:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);

এটি সূক্ষ্মভাবে কাজ করে, তবে যখন টেবিলটি সর্বাধিক হয়, আমি শেষ কলামের ডানদিকে ফাঁকা স্থান পাই। পুনরায় আকার দেওয়ার সাথে সাথে উইন্ডোটির শেষ প্রান্তে শেষ কলামটি আকার পরিবর্তন করা সম্ভব?

আমি পেয়েছি AUTO_RESIZE_LAST_COLUMN ডক্সে সম্পত্তি তবে এটি কার্যকর হয় না।

সম্পাদনা: JTableএর একটি JScrollPaneপছন্দসই আকার সেট করা আছে।

উত্তর:


45

দিলে কি হবে আপনাকে কল setMinWidth(400)গত কলামে পরিবর্তে এর setPreferredWidth(400)?

জন্য JavaDoc সালে JTable, এর জন্য দস্তাবেজ পড়তে doLayout()খুব সাবধানে। এখানে কিছু পছন্দসই বিট রয়েছে:

যখন কোনও এনকোলেসিং উইন্ডোর আকার পরিবর্তন করার ফলস্বরূপ পদ্ধতিটি ডাকা হয়, তখন আকার পরিবর্তনকারী কলামটি বাতিল হয়। এর অর্থ হল যে জেটিবেলের "বাইরের" আকার পরিবর্তন হয়েছে এবং পরিবর্তনটি - বা "ব-দ্বীপ" - এই জেটিবেলের স্বয়ংক্রিয় আকার পরিবর্তন মোড নির্বিশেষে সমস্ত কলামে বিতরণ করা উচিত।

এটি হতে পারে কেন AUTO_RESIZE_LAST_COLUMNআপনাকে সাহায্য করেনি।

দ্রষ্টব্য: যখন একটি JTable কলামগুলির প্রস্থগুলিতে সামঞ্জস্য করে তখন এটি তাদের ন্যূনতম এবং সর্বাধিক মানকে একেবারে সম্মান করে।

এটি বলে যে আপনি সর্বনিম্ন কলামগুলি ছাড়াও সর্বনিম্ন == সর্বোচ্চ সেট করতে চাইতে পারেন, তারপরে সর্বনিম্ন কলামে সর্বনিম্ন = পছন্দসই সেট করুন এবং ম্যাক্স সেট করবেন না বা ম্যাক্সের জন্য খুব বড় মান সেট করবেন না।


4
সেটমিনউইথ (400) এখনও টেবিলের ডানটি ফাঁকা হওয়ার কারণ দেখায়
হামজা ইয়ারলিকায়া

4
এতে কোনও পার্থক্য রয়েছে কিনা তা দেখতে setMaxWidth (10000) যুক্ত করার চেষ্টা করুন।
এডি

4
লাইন টেবিলটি সরিয়ে দিন.সেটআউটো রিসাইজমোড (JTable.AUTO_RESIZE_OFF); এটি আপনার চাইলে আকার পরিবর্তন করতে পারে।
এডি

আপনি সম্ভবত জেটিবেলে ন্যূনতম এবং সর্বাধিক আকার নির্ধারণ করতে চান, যদি আপনি ইতিমধ্যে না থাকেন,
এডি

4
সারণী মডেল প্রয়োগের পরে আপনি সেটমিনউইথ কল করেন তা নিশ্চিত করুন ... যা আমাকে একবারের জন্য ট্রিপ করেছে।
ব্রায়ান নোব্লাচ

23

এর সাথে JTable.AUTO_RESIZE_OFF, সারণীটি আপনার জন্য কোনও কলামের আকার পরিবর্তন করবে না, তাই এটি আপনার পছন্দসই সেটিংটি নেবে। শেষ কলামটি বাকী অংশটি পূরণ না করে যদি আপনার পছন্দসই আকারে কলামগুলি ডিফল্ট হওয়া আপনার লক্ষ্য হয় তবে আপনার JTable.AUTO_RESIZE_LAST_COLUMNঅটোরাইজমোড ব্যবহারের বিকল্প রয়েছে , তবে এটি ব্যবহার করার সময় এটি সবচেয়ে কার্যকর হতে পারেTableColumn.setMaxWidth() টেবিলকলামের পরিবর্তে এটি । সর্বশেষ কলাম ব্যতীত সকলের জন্য setPreferredWidth ()।

আপনি যখন সন্তুষ্ট হন যা AUTO_RESIZE_LAST_COLUMNবাস্তবে কাজ করে, আপনি TableColumn.setMaxWidth()এবং এর সংমিশ্রণ নিয়ে পরীক্ষা করতে পারেনTableColumn.setMinWidth()


4
যখন AUTO_RESIZE_LAST_COLUMN টেবিলটি স্ক্রল ফলকে ফিট করার জন্য পুনরায় আকার দেওয়া হয় তখন আমার লক্ষ্যটি নির্দিষ্ট ন্যূনতম আকারে টেবিলটি রাখা তবে এটি আমার মিনিম আকারের চেয়ে বড় হলে এটি বাড়িয়ে তুলতে হবে।
হামজা ইয়ারলিকায়া

আপনি টেবিলকলাম.সেটমিনউইথ () এর পরিবর্তে টেবিলকলাম.সেটম্যাক্সউইথ () ব্যবহার না করে আপনি এই আচরণ করতে পারেন।
akf

আমার শেষ মন্তব্যে যোগ করতে: শেষ কলাম সহ আপনার টেবিলের প্রতিটি কলামের জন্য টেবিল কলাম.সেটমিনউইথ () ব্যবহার করুন।
akf

সর্বনিম্ন এবং সর্বোচ্চ প্রস্থ উভয়ই সেট করা সমস্যার সমাধান করেছে তবে এখন স্ক্রোল বারগুলি মিসিন।
হামজা ইয়ারলিকায়া

16

JTable.AUTO_RESIZE_LAST_COLUMN"সমস্ত আকার পরিবর্তন ক্রিয়াকলাপগুলির সময়, কেবলমাত্র শেষ কলামে সামঞ্জস্যতা প্রয়োগ করুন" হিসাবে সংজ্ঞায়িত করা হয়েছে যার অর্থ আপনাকে নিজের কোডের শেষে অটোরেসাইজমোড সেট করতে হবে, অন্যথায় সেটপ্রেডওয়ার্ড উইথ () কোনও প্রভাব ফেলবে না!

সুতরাং আপনার ক্ষেত্রে এটি সঠিক উপায় হবে:

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);

5

এই পদ্ধতিটি ব্যবহার করুন

public static void setColumnWidths(JTable table, int... widths) {
    TableColumnModel columnModel = table.getColumnModel();
    for (int i = 0; i < widths.length; i++) {
        if (i < columnModel.getColumnCount()) {
            columnModel.getColumn(i).setMaxWidth(widths[i]);
        }
        else break;
    }
}

বা JTableশ্রেণি প্রসারিত করুন :

public class Table extends JTable {
    public void setColumnWidths(int... widths) {
        for (int i = 0; i < widths.length; i++) {
            if (i < columnModel.getColumnCount()) {
                columnModel.getColumn(i).setMaxWidth(widths[i]);
            }
            else break;
        }
    }
}

এবং তারপর

table.setColumnWidths(30, 150, 100, 100);

4

Kleopatra এর মন্তব্য পড়া (তার 2nd সময় তিনি কটাক্ষপাত আছে পরামর্শ দেওয়া javax.swing.JXTable , এবং এখন আমি অ্যাম দুঃখিত আমি প্রথমবার একটি চেহারা আছে করা হয়নি :)) আমি তোমাদের লিঙ্কটি অনুসরণ করুন সুপারিশ

একই সমস্যার জন্য আমার এই সমাধানটি ছিল: (তবে আমি আপনাকে উপরের লিঙ্কটি অনুসরণ করার পরামর্শ দিই) সারণির আকার পরিবর্তন করতে, সারণীর কলামের প্রস্থকে বর্তমান সারণীর মোট প্রস্থে স্কেল করুন। এটি করার জন্য আমি (আপেক্ষিক) কলামের প্রস্থের জন্য বিশ্বব্যাপী ints ব্যবহার করি:

private int[] columnWidths=null;

আমি এই ফাংশনটি টেবিল কলামের প্রস্থগুলি সেট করতে ব্যবহার করি:

public void setColumnWidths(int[] widths){
    int nrCols=table.getModel().getColumnCount();
    if(nrCols==0||widths==null){
        return;
    }
    this.columnWidths=widths.clone();

    //current width of the table:
    int totalWidth=table.getWidth();

    int totalWidthRequested=0;
    int nrRequestedWidths=columnWidths.length;
    int defaultWidth=(int)Math.floor((double)totalWidth/(double)nrCols);

    for(int col=0;col<nrCols;col++){
        int width = 0;
        if(columnWidths.length>col){
            width=columnWidths[col];
        }
        totalWidthRequested+=width;
    }
    //Note: for the not defined columns: use the defaultWidth
    if(nrRequestedWidths<nrCols){
        log.fine("Setting column widths: nr of columns do not match column widths requested");
        totalWidthRequested+=((nrCols-nrRequestedWidths)*defaultWidth);
    }
    //calculate the scale for the column width
    double factor=(double)totalWidth/(double)totalWidthRequested;

    for(int col=0;col<nrCols;col++){
        int width = defaultWidth;
        if(columnWidths.length>col){
            //scale the requested width to the current table width
            width=(int)Math.floor(factor*(double)columnWidths[col]);
        }
        table.getColumnModel().getColumn(col).setPreferredWidth(width);
        table.getColumnModel().getColumn(col).setWidth(width);
    }

}

আমি কল করি ডেটা সেট করার সময়:

    setColumnWidths(this.columnWidths);

এবং পরিবর্তনের সময় আমি টেবিলের পিতামাতার কাছে সেট কম্পোনেন্টলিস্টনারকে কল করি (আমার ক্ষেত্রে জেএসক্রোলপ্যানটি যা আমার টেবিলের ধারক):

public void componentResized(ComponentEvent componentEvent) {
    this.setColumnWidths(this.columnWidths);
}

নোট করুন যে JTable টেবিলটিও বিশ্বব্যাপী:

private JTable table;

এবং এখানে আমি শ্রোতা সেট:

    scrollPane=new JScrollPane(table);
    scrollPane.addComponentListener(this);

4
আমি যতদূর দেখতে পাচ্ছি, এটি হ'ল (খুব ভঙ্গুর) হ্যাক: এটি কলামের প্রস্থ পরিবর্তন করে ব্যবহারকারীদের উপর আপডেট হয় না। আবার, আমি আপনাকে জেএক্সটিবেলের উত্স কোডটি সন্ধান করার পরামর্শ দিচ্ছি - এতে একটি অতিরিক্ত সম্পত্তি অনুভূমিক স্ক্রোল রয়েছে যা উপলব্ধ প্রস্থটি পূরণ করতে ট্রিগার করে যদি কলাম প্রিফের যোগফল বর্তমান প্রস্থের চেয়ে কম হয় এবং অন্যথায় অনুভূমিক স্ক্রোলবার দেখায়
ক্লিওপেট্রা

আমি জানি এটি ব্যবহারকারীর পক্ষে টেবিলের প্রস্থটি ম্যানুয়ালি পরিবর্তিত হওয়ার ক্ষেত্রে প্রতিক্রিয়া দেখায় না, এটি হ্যাক ... তবে আবার: এটি উপরে প্রস্তাবিতের চেয়ে ভাল। তবে আপনি আমাকে জেএক্সটবেলে কৌতূহলী করে তুলেছেন .... আমার সেখানে একবার নজর থাকবে! (এবং আপনাকে আবার কোনও টেবিলের
বিষয়টিতে যেতে ভাল লাগল

আপনি ঠিক বলেছেন, আমার উত্তরের উপরে আমার মন্তব্য দেখুন, আমি আপনার মন্তব্যকে উজ্জীবিত করেছি!
michel.iamit

কমপক্ষে এটি আমার পক্ষে কার্যকর ছিল, আমি কলামের ওজন নীতি দিয়ে আমার ক্ষেত্রে এই পদ্ধতির ব্যবহার করেছি।
সোলোস্টারান 14

2
fireTableStructureChanged();

পুনরায় আকার পরিবর্তন করতে হবে ! এই কোডটি যদি আপনার কোডের কোথাও কল করা হয় তারপরে আপনি কলামটির পুনরায় আকারের বৈশিষ্ট্য নির্ধারণ করে দিলে আপনার সমস্ত সেটিংস পুনরায় সেট হয়ে যাবে। এই পার্শ্ব প্রতিক্রিয়া অপ্রত্যক্ষভাবে ঘটতে পারে। বৈশিষ্ট্য নির্ধারণের পরে লিঙ্কযুক্ত ডেটা মডেলটি এই পদ্ধতিতে যেভাবে ডাকা হয় তার পরিবর্তনের ফলস্বরূপ Fe


1

বিকল্পের প্রয়োজন নেই, কেবল সর্বশেষ কলামটির পছন্দসই প্রস্থকে সর্বাধিক করুন এবং এটি সমস্ত অতিরিক্ত স্থান গ্রহণ করবে।

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(Integer.MAX_INT);

0

এই কোডটি সেটআউটআরাইজমোডগুলি ছাড়াই আমার জন্য কাজ করা হয়।

        TableColumnModel columnModel = jTable1.getColumnModel();
        columnModel.getColumn(1).setPreferredWidth(170);
        columnModel.getColumn(1).setMaxWidth(170);
        columnModel.getColumn(2).setPreferredWidth(150);
        columnModel.getColumn(2).setMaxWidth(150);
        columnModel.getColumn(3).setPreferredWidth(40);
        columnModel.getColumn(3).setMaxWidth(40);

-2

এই কোড ব্যবহার করুন। এটা আমার জন্য কাজ করেছে। আমি 3 টি কলামের জন্য বিবেচনা করেছি। আপনার কোডের জন্য লুপ মান পরিবর্তন করুন।

TableColumn column = null;
for (int i = 0; i < 3; i++) {
    column = table.getColumnModel().getColumn(i);
    if (i == 0) 
        column.setMaxWidth(10);
    if (i == 2)
        column.setMaxWidth(50);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.